2013-06-25 69 views
1

這可能是一個多餘的問題,但我已經嘗試從其他相關主題的以前的答案,但還是無法弄明白。Django的GROUP BY ID,然後選擇最大時間戳

我有一個表Board_status看起來是這樣的(多個狀態和時間戳,每塊板):

time  | board_id | status 
------------------------------- 
2012-4-5 |  1 | good 

2013-6-6 |  1 | not good 

2013-6-7 |  1 | alright 

2012-6-8 |  2 | good 

2012-6-4 |  3 | good 

2012-6-10 |  2 | good 

現在我想選擇Board_status表中的所有記錄,組所有的人都通過board_id爲不同board_id,然後選擇每塊電路板上的最新狀態。基本上結束了,像這樣(只最新狀態和時間戳,每塊板)表:

time  | board_id | status 
------------------------------ 
2013-6-7 |  1 | alright 

2012-6-4 |  3 | good 

2012-6-10 |  2 | good 

我曾嘗試:

b = Board_status.objects.values('board_id').annotate(max=Max('time')).values_list('board_id','max','status') 

,但似乎並不像它的工作。每個board_id仍然給我超過1條記錄。

我應該在Django中使用哪個命令來執行此操作?

回答

1

的更新,這是我使用的解決方案。不是最好的,但它現在的作品:

b=[] 
a = Board_status.objects.values('board_id').distinct() 
for i in range(a.count()): 
b.append(Board_status.objects.filter(board_id=a[i]['board_id']).latest('time')) 

所以我得到了所有board_id,存儲到列表a。然後,對於每個board_id,執行另一個查詢以獲取最新時間。任何更好的答案仍然受到歡迎。

0

它將如何工作?您既沒有過濾器也沒有截然不同的過濾器。我不確定這是否可以在單個django查詢中輕鬆完成。你應該閱讀更多關於:

  1. https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
  2. https://docs.djangoproject.com/en/1.4/topics/db/aggregation/

如果不能在1個原始的SQL查詢做到這一點,你不能用一個OR映射器做到這一點無論是作爲它的建成在MySQL的頂部(在你的情況)。你能告訴我你將如何通過原始SQL做到這一點?

+0

我認爲你是對的。我一直試圖在原始SQL中執行它,但也無法在1個查詢中獲得它。我正在考慮將所有board_id讀入數組,然後從該數組到數據庫執行for循環以獲取最新記錄。如果我的桌子變大了,會很麻煩... – Linh