2016-11-21 5 views
0

Предположим, что мы имеем гипотетическую таблицу, которая выглядит примерно так:Peewee: используя COUNT (*) в запросе выборки

id   color   group_id 
---------- ------------- ---------- 
1   red   100 
2   blue   101 
3   orange   100 
4   red   102 
5   pink   103 
6   red   104 
7   orange   104 
8   orange   105 

Я хочу, чтобы выбрать идентификатор группы, который содержит в себе все цвета определенного набора цветов. Предположим, я хочу найти идентификатор группы, где находятся red и orange. Необработанный SQL-запрос будет что-то вроде:

SELECT group_id 
    FROM colors 
    WHERE color 
     IN ('red', 'orange') 
GROUP BY group_id 
    HAVING COUNT(*) = 2; 

Это вернет идентификатор группы 100 и 104. Что такое Peewee SelectQuery для этого? У меня возникли проблемы с тем, как представить бит COUNT(*).

ответ

2

Конечно вещь:

(Colors 
.select(Colors.group) 
.where(Colors.color << ('red', 'orange')) 
.group_by(Colors.group) 
.having(fn.COUNT(Colors.id) == 2)) 

В качестве альтернативы, вы можете сделать:

.having(fn.COUNT(SQL('*')) == 2) 

Там какая-то перекрытие здесь с типом "Top N объектов в группе" ситуации. Ряд решений документируются здесь:

http://docs.peewee-orm.com/en/latest/peewee/hacks.html#top-n-objects-per-group

Наконец, это также похоже на поиск объектов с тегами определенного набора тегов. Есть примеры запросов на моем блоге здесь:

http://charlesleifer.com/blog/a-tour-of-tagging-schemas-many-to-many-bitmaps-and-more/

+0

Awesome, спасибо за указателем. Я также пришел к аналогичному решению в конце, но использовал 'fn.Count (fn.Distinct (Colors.id))' в предложении '.having'. Отличный блог кстати! – mart1n

 Смежные вопросы

  • Нет связанных вопросов^_^