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

时间:2012-03-02 18:35:16

标签: django postgresql random django-orm django-filter

情景:

我在视图中有一个模型,我正在使用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

我认为可能存在任何方式将随机添加到选择,任何想法?

3 个答案:

答案 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”代替不同的解决方案),我相信一个比我的更优雅。