情景:
我在视图中有一个模型,我正在使用django-filters,所以我需要使用django-filters过滤查询集并随机排序。
问题: django-filters为SQL 添加了DISTINCT,如:
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
我认为可能存在任何方式将随机添加到选择,任何想法?
答案 0 :(得分:2)
您只需使用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
希望这对你有用
答案 1 :(得分:1)
使用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();
答案 2 :(得分:0)
是否可以使用嵌套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”代替不同的解决方案),我相信一个比我的更优雅。