2016-11-21 103 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 

我想選擇其中包含一套特定的所有顏色組ID的顏色。假設我想要搜索顏色爲redorange的組ID。原始SQL查詢會是這樣的:

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

這將返回組ID 100104。什麼是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) 

這裏有與 「前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

真棒,謝謝你的指針。我最後也得到了類似的解決方案,但在'.having'子句中使用了'fn.Count(fn.Distinct(Colors.id))'。偉大的博客btw! – mart1n