2012-03-02 2 views
2

시나리오 :동시에 DISTINCT 및 ORDER BY RANDOM을 사용하여 SELECT를 수행하는 방법은 무엇입니까?

뷰에 모델이 있습니다. 장고 필터를 사용하고 있습니다. 따라서 장고 필터로 필터링 된 쿼리 세트를 무작위로 정렬해야합니다.

시트 문제점 : 장고 - 필터는 SQL에 DISTINCT 추가, 뭔가 같은 :

ERROR : 그 PostgreSQL의에 대한 예외를 생성

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

그러나 BY SELECT DISTINCT, ORDER에 대해 표현식은 선택 목록에 나타나야합니다. SQL 상태 : 42P10 문자 : 1992

나는 임의의 방법으로 rando를 추가 할 수 있다고 생각합니다. 선택, 어떤 아이디어에?

답변

2

당신은 대신 당신

+0

나쁜 것은 내가 django * 필터를 해킹해야합니다 – diegueus9

0

을 위해 작동 할 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 

희망이 중첩 된 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

@ Shivam이 작성한대로 GROUP BY을 사용하십시오. 그러나 그의 구문은 유효하지 않습니다.
GROUP BYORDER 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();