2016-11-21 7 views
0

にCOUNT(*)を使用して、我々は次のようになります架空のテーブルを持っていると仮定します。私は、特定のセットのすべての色を含むグループのIDを選択するピーウィー:選択クエリ

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 

色の色がredorangeのグループIDを検索したいとします。これは、グループID 100104を返します

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

:生のSQLクエリは次のようなものになるだろう。このための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