2011-07-27 69 views
4

我想執行使用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 

主要是自內連接。祝你好運,希望這能幫到你。

回答

3

我其實在過去幾天剛剛經歷過這個問題,發佈了一個問題,但在我看來,它的措辭不如您的。

無論如何,我發現,雖然Sqlite和MySql不會給你一個錯誤,當你選擇在group by子句中找不到列的查詢時,這些結果可能有點可疑,因爲sql的標準顯然是不允許這樣做。我知道當你嘗試這個時,MSSQL會返回一個錯誤,我不確定其他風格的SQL。

基於此,我得出的結論是,django不允許通過ORM生成類似的查詢,因爲它在技術上無效,即使它在某種程度上可能對某些SQL有用。

這裏是鏈接到我的問題以供參考:Can I control the GROUP BY in django 1.3's orm?

+0

我明白了。以下內容非常有趣:「...當您運行查詢時,MySql不會在您選擇在group by子句中找不到列的查詢時出現錯誤...」如果沒有其他,這將爲我提供另一種探索途徑。 – mattdeboard

+0

您想要選擇不在group by子句中的列(content_type__id),是否正確?這正是我想要做的,我發現在Django中不可能這樣做,因爲在原始sql語句中這樣做是無效的,即使它在某些sql風格中可能會在某種程度上起作用。 – mockobject

+0

是的,你可以使用原始的sql來看看它是如何工作在不同的sql風格上的,它可能不會很一致。我確實發現了這個方便的鏈接,它有點解釋了這個問題,並向你展示了不同的sql風格的不同結果,儘管其中許多不起作用。 http://sqlzoo.net/howto/source/u.cgi/err979/mysql – mockobject

相關問題