[英]Django: distinct on a foreign key, then ordering
我有兩個模型,分別是Track
和Pair
。 每Pair
有track1
, track2
和popularity
。 我正在嘗試通過成對的流行程度(降序)獲得有序列表,沒有兩個對具有相同的track1
。 到目前為止,這是我嘗試過的方法:
lstPairs = Pair.objects.order_by('-popularity','track1__id').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
這給了我以下錯誤:
ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
...所以我嘗試了這個:
lstPairs = Pair.objects.order_by('-popularity','track1__id').distinct('popularity', 'track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
這給了我重復的track1__id
的條目。 有誰知道解決這個問題的方法嗎? 我猜我將不得不使用raw()
或類似的東西,但我不知道如何解決這樣的問題。 我將PostgreSQL用於數據庫后端,因此應支持DISTINCT
。
首先,讓我們澄清一下: DISTINCT
是標准SQL,而DISTINCT ON
是PostgreSQL擴展。
錯誤( DISTINCT ON expressions must match initial ORDER BY expressions
)表明,您應該修復ORDER BY
子句,而不是DISTINT ON
(如果這樣做,您將得到不同的結果,就像您已經體驗過的那樣)。
DISTINCT ON
表達式必須與最左邊的ORDER BY表達式匹配。 ORDER BY子句通常將包含其他表達式,這些表達式確定每個DISTINCT ON組中所需的行優先級。
這將為您帶來預期的結果:
lstPairs = Pair.objects.order_by('track1__id','-popularity').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
在SQL中:
SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
FROM pairs
ORDER BY track1__id, popularity DESC
但是可能順序錯誤。
如果您要原始訂單,可以在此處使用子查詢:
SELECT *
FROM (
SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
FROM pairs
ORDER BY track1__id
-- LIMIT here, if necessary
)
ORDER BY popularity DESC, track1__id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.