如何同时使用 DISTINCT 和 ORDER BY RANDOM 进行 SELECT?

Posted

技术标签:

【中文标题】如何同时使用 DISTINCT 和 ORDER BY RANDOM 进行 SELECT?【英文标题】:How I can make SELECT using DISTINCT and ORDER BY RANDOM at same time? 【发布时间】:2012-03-21 06:25:56 【问题描述】:

场景:

我在视图中有一个模型,我正在使用 django-filters,所以我需要创建一个由 django-filters 过滤并随机排序的查询集。

问题: django-filters 将 DISTINCT 添加到 SQL 中,类似于:

SELECT DISTINCT ... WHERE ("products_creditcard"."is_active" = True  AND    ("products_creditcard"."bank_id" = 3  OR "products_creditcard"."bank_id" = 1  OR "products_creditcard"."bank_id" = 4 )) ORDER BY RANDOM()

但这会为 postgresql 生成异常:

错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中 SQL状态:42P10 人物:1992

我认为可能存在将随机添加到选择中的任何方式,有什么想法吗?

【问题讨论】:

【参考方案1】:

你只需要使用 group by 而不是 DISTINCT

SELECT  ... WHERE ("products_creditcard"."is_active" = True  AND    ("products_creditcard"."bank_id" = 3  OR "products_creditcard"."bank_id" = 1  OR "products_creditcard"."bank_id" = 4 )) ORDER BY RANDOM() GROUP BY fieldName

希望这对你有用

【讨论】:

坏事是我需要 hack django*filters【参考方案2】:

可以使用嵌套 SQL 吗?

这可能不是最好的方法,但也许这样的方法会在紧要关头起作用:

SELECT 
   * 
FROM 
   (SELECT DISTINCT ... 
    WHERE 
       ("products_creditcard"."is_active" = True 
          AND("products_creditcard"."bank_id" = 3  
          OR "products_creditcard"."bank_id" = 1  
          OR "products_creditcard"."bank_id" = 4)
   ) AS Source
ORDER BY RANDOM()

编辑:查看此页面上的另一种解决方案(关于使用“group by”代替 distinct 的解决方案),我相信这个解决方案比我的要优雅得多。

【讨论】:

【参考方案3】:

使用GROUP BY,正如@Shivam 所写。但他的语法无效。GROUP BY 必须在ORDER BY 之前。像这样:

SELECT p.column1, p.column2, ..
FROM   products_creditcard p
WHERE  p.is_active
AND    p.bank_id IN (1, 3, 4)
GROUP  BY p.column1, p.column2, ..
ORDER  BY random();

【讨论】:

以上是关于如何同时使用 DISTINCT 和 ORDER BY RANDOM 进行 SELECT?的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个 SELECT 语句中使用 DISTINCT 和 ORDER BY?

如何对包含子句“order by”、“desc”和“Limit”的多个列使用 distinct

如何在同一个SELECT语句中使用DISTINCT和ORDER BY?

使用 distinct 后如何执行 order_by?

如何使用 TOP 1 Info 和 Order By 从 Top 1 Info 中选择 DISTINCT 信息

如何应用:大查询中的count(distinct ...)超过(partition by ... order by)?