如何同时使用 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?