我有两个模型,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
s的条目。有谁知道解决这个问题的方法吗?我猜我将不得不使用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表达式(S)相匹配。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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句