やりたいこと
組み合わせで縦持ちしているテーブルがあると思います。
権限管理やグループ管理とかでよく使うやつかと。
userid | groupid |
---|---|
u01 | g01 |
u01 | g02 |
u01 | g03 |
u02 | g02 |
u02 | g03 |
u03 | g01 |
u04 | g01 |
u04 | g02 |
u05 | g02 |
ここから、「g01とg02の両方に属している(AND)useridを抽出」したいのです。
ぱっと思いつかず調べてみると、
「横持ちに変換する」ソリューションがよくヒットしましたが、
groupidが運用によって増えていくような状況だと、あまり適しません。
思いついた
当然他でもやっている方はいらっしゃるでしょうが、あまり見かけなかったので紹介します。
select userid, count(1) from table where groupid in ('g01','g02') group by userid having count(1) = 2
userid | count(1) |
---|---|
u01 | 2 |
u04 | 2 |
in句に入る個数をhaving句にも入れる感じです。
'g01','g02','g03' なら having count(1) = 3