Как я могу сделать SELECT, используя DISTINCT и ORDER BY RANDOM одновременно? - PullRequest
2 голосов
/ 02 марта 2012

Сценарий:

У меня есть модель в виде, я использую django-фильтры, поэтому мне нужно создать набор запросов, отфильтрованный по django-фильтрам и упорядоченный случайным образом.

Проблема: django-filters добавляет DISTINCT к 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

Я думаю, может существовать какой-либо способ добавить случайное число к выбору, какие-либо идеи?

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Вам просто нужно использовать 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 голос
/ 03 марта 2012

Используйте 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();
0 голосов
/ 02 марта 2012

Можно ли использовать вложенный 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()

edit: поиск другого решения на этой странице (то, что об использовании)Я считаю, что один из них гораздо элегантнее моего.

...