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

标签 python django postgresql distinct

我有两个模型,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/

相关文章:

python - 更改 IPython 流编码

mysql - 错误(Mac 操作系统): sudo pip install MySQl-python

git - 提交到 git 时 stash spring-boot 中 application.properties 中的信息

sql - PostgreSQL。物化 View 不能使用绑定(bind)参数定义

python - 计算 Django 项目中的代码行数

postgresql - PostgreSQL 是否有任何列保持表行之间的唯一性,就像 oracle 有 rowId 和 rowNum 一样?

python - 不可哈希类型 : 'list' in dictionary

python - 如何正确创建 pyinstaller Hook ,或者隐藏导入?

python - Keras 自定义层值错误 : An operation has `None` for gradient

python - 将标签与过滤器结合起来