やりたいこと
組み合わせで縦持ちしているテーブルがあると思います。
権限管理やグループ管理とかでよく使うやつかと。
| 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