2012-03-02 88 views
2

该场景:我如何使用DISTINCT和ORDER BY RANDOM同时进行SELECT?

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

的问题: Django的过滤器增加了一个清晰到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

我想可能存在任何添加rando的方法米到选择,任何想法?

回答

2

你只需要通过使用组,而不是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 

希望这会为你

+0

Tha坏事是我需要hack django * filters – diegueus9 2012-03-02 19:14:27

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() 

编辑:看这个页面(一个有关使用“组通过”关于其他解决方案不同的),我相信一个比我更优雅。

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(); 
相关问题