gpt4 book ai didi

python - Django:在外键上不同,然后排序

转载 作者:行者123 更新时间:2023-11-29 14:11:14 24 4
gpt4 key购买 nike

我有两个模型,TrackPair。每个Pair 都有一个track1track2popularity。我正在尝试按对的受欢迎程度(降序)获取有序列表,没有两对具有相同的 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(如果你这样做,你最终会得到不同的结果,就像你已经体验过的那样)。

The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group.

这会给你预期的结果:

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

关于python - Django:在外键上不同,然后排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com