2013-01-22 67 views
0

結合說我有以下數據:Django的1.4/1.5控制GROUP BY和HAVING

| id | user_id | time | 
| 1 | 1  | 10.0 | 
| 2 | 1  | 12.0 | 
| 3 | 2  | 11.0 | 
| 4 | 2  | 13.0 | 

我要的是查詢該表,這樣我得到了MIN(time)user_id

| id | user_id | time | 
| 1 | 1  | 10.0 | 
| 3 | 2  | 11.0 | 
嘗試使用當

SELECT id, user_id, time FROM table GROUP BY user_id HAVING MIN(time) 

然而,:

所以我的SQL想這,Django會在任意的(錯誤的)領域GROUP BY。例如參見下面的代碼和所得到的(簡化的)SQL:

>>> Table.objects.annotate(Min('time')).query 
SELECT id, user_id, time, MIN(time) FROM table GROUP BY id, user_id, time 

>>> Table.objects.values('id', 'time').annotate(Min('time')).query 
SELECT id, time, MIN(time) FROM table GROUP BY id, time 

產生的SQL是遠離我的希望的輸出。我目前正在通過使用原始SQL來解決這個問題,但是這首先破壞了使用ORM的目的。此外,所得的代碼是難以再利用爲正常.filter()不能應用。

有關於這種類型的查詢類似的問題,但是他們都比較老,因爲1.3不包括改變Django的。

+0

只是用戶'用戶'列按'Table.objects.values('用戶')分組。註釋(最小('時間'))'? –

+0

這並沒有給我結果的ID,只有USER_ID和時間。 – bouke

+0

'Table.objects.values( '用戶')。註釋(民( '時間'))值( '身份證', '用戶', '時間')'這應該工作 –

回答

1

它不漂亮的代碼,但。使用django的'額外'查詢集方法和作爲參數的地方,您可以實現獲取所需的結果集。即

Table.objects.extra(where=['id IN (SELECT id FROM table_name' 
          '  GROUP BY user_id HAVING MIN(time))'])