【问题标题】:Query excluding duplicates in Django查询排除 Django 中的重复项
【发布时间】:2016-12-29 18:16:53
【问题描述】:

我正在使用distinct() QuerySet 在 Django 中获取一些数据。
我最初的查询是Point.objects.order_by('chron', 'pubdate')
在某些情况下,chron 字段是重复的,所以我更改了查询 到Point.objects.order_by('chron', 'pubdate').distinct('chron') 以排除重复项。 现在的问题是所有空字段都被认为是重复的。

准确地说,chron 字段包含整数(其行为类似于 id),在某些情况下它可以是重复的,在某些情况下它可以是 NULL。

| chron |
|-------|
| 1     | I want this
| 2     | I want this
| 3     | I want this
| 3     |
| NULL  |
| 4     | I want this
| NULL  |

我想排除所有 chron 重复项,但如果它们是 NULL 的重复项则不排除。 谢谢。

【问题讨论】:

标签: django


【解决方案1】:

使用两个单独的查询。

  • .distinct("chron").exclude(chron__isnull=True)

  • .filter() 仅适用于 chron 值,其中 chron__isnull=True

虽然这看起来效率很低,但我相信(我很乐意得到纠正)即使是任何明智的普通 SQL 语句(例如下面)也需要多次表扫描才能加入空值和唯一值的结果集。

SELECT *
FROM (
    SELECT chron
    FROM Point
    WHERE chron IS NOT NULL  # .exclude()
    GROUP BY chron  # .distinct()

    UNION ALL

    SELECT chron
    FROM Point
    WHERE chron IS NULL  # .include()
)

【讨论】:

  • 你为什么要GROUP BY而不是SELECT DISTINCT
  • 谢谢,它稍作调整:chron__isnull 而不是chron__is_null,我想是因为chronIntegerField
  • 我将使用更正的语法更新答案。请务必将您的问题标记为已回答。
  • @SardorbekImomaliev 我研究了这个,因为我最初是出于习惯这样做的。根据此处的答案 (stackoverflow.com/questions/581521/…),在按非索引列分组时,最好使用 DISTINCT。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 2018-10-26
  • 2016-03-23
  • 2011-05-03
  • 1970-01-01
  • 2011-12-12
  • 2012-11-02
  • 2016-11-07
相关资源
最近更新 更多