2012-03-02 93 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(); 
相關問題