我想執行使用Django的ORM以下查詢:如何包含查找列但將其從GROUP BY中排除?
SELECT object_repr, content_type_id, COUNT(object_repr)
FROM django_admin_log GROUP BY object_repr ORDER BY COUNT(object_repr);
我得到的最接近的是:
LogEntry.objects.values('object_repr', 'content_type__id')\
.annotate(num_logs=Count('object_repr'))\
.order_by('num_logs')
不幸的是這會產生一個返回錯誤的SQL語句(或者,在至少意外)結果:
SELECT `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`,
COUNT(`django_admin_log`.`object_repr`) AS `num_logs`
FROM `django_admin_log`
GROUP BY `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`
ORDER BY num_logs
values()方法包括「GROUP BY」段中的所有指定列,但我不想要content_type_id
在我的GROUP BY中。甚至可以在ORM中做到這一點?
編輯:原來這在ORM中是不可能的。然而,在未來的人發現這個問題的興趣,查詢我寫了做什麼,我需要的是:
SELECT DISTINCT djl2.id, djl1.object_id, djl1.object_repr,
djl1.content_type_id,
COUNT(djl1.content_type_id) AS num_items
FROM django_admin_log AS djl1
INNER JOIN django_admin_log AS djl2
ON djl1.id=djl2.id
GROUP BY djl1.object_repr, djl1.content_type_id
ORDER BY num_items
主要是自內連接。祝你好運,希望這能幫到你。
我明白了。以下內容非常有趣:「...當您運行查詢時,MySql不會在您選擇在group by子句中找不到列的查詢時出現錯誤...」如果沒有其他,這將爲我提供另一種探索途徑。 – mattdeboard
您想要選擇不在group by子句中的列(content_type__id),是否正確?這正是我想要做的,我發現在Django中不可能這樣做,因爲在原始sql語句中這樣做是無效的,即使它在某些sql風格中可能會在某種程度上起作用。 – mockobject
是的,你可以使用原始的sql來看看它是如何工作在不同的sql風格上的,它可能不會很一致。我確實發現了這個方便的鏈接,它有點解釋了這個問題,並向你展示了不同的sql風格的不同結果,儘管其中許多不起作用。 http://sqlzoo.net/howto/source/u.cgi/err979/mysql – mockobject