前提
A君:リンゴ、ミカン、モモ
B君:ミカン、モモ
C君:リンゴ、ミカン、ナシ
という持ち物データがあります。
それを、
持ち物テーブル
名前 | 持ち物 |
---|---|
A君 | リンゴ |
A君 | ミカン |
A君 | モモ |
B君 | ミカン |
B君 | モモ |
C君 | リンゴ |
C君 | ミカン |
C君 | ナシ |
果物マスタ
id | 果物 |
---|---|
0 | リンゴ |
1 | ミカン |
2 | モモ |
3 | ナシ |
という形式で持っています。
やりたいこと
↓のような、組み合わせの数を集計したい。
例:「リンゴとミカン」の組み合わせを持っている人数は2人
リンゴ | ミカン | モモ | ナシ | |
---|---|---|---|---|
リンゴ | × | 2 | 1 | 1 |
ミカン | × | × | 2 | 1 |
モモ | × | × | × | 0 |
ナシ | × | × | × | × |
どちらかと言えばこうすべきか?
組合せ1 | 組合せ2 | COUNT |
---|---|---|
リンゴ | ミカン | 2 |
リンゴ | モモ | 1 |
リンゴ | ナシ | 1 |
ミカン | モモ | 2 |
ミカン | ナシ | 1 |
モモ | ナシ | 0 |
試したこと
SQL
1SELECT 2 'リンゴ' AS '組合せ1' 3, 持ち物 AS '組合せ2' 4, COUNT(持ち物) 5FROM 6 持ち物テーブル 7WHERE 8 名前 = (SELECT DISTINCT 名前 9 FROM 持ち物テーブル 10 WHERE 持ち物 = 'リンゴ') AS 'リンゴ持ってる人リスト' 11GROUP BY 持ち物
とすると、
組合せ1 | 組合せ2 | COUNT |
---|---|---|
リンゴ | ミカン | 2 |
リンゴ | モモ | 1 |
リンゴ | ナシ | 1 |
は得られますが、これをマスタの中身の数だけ取得したい(実際のマスタの中身は100以上のため手ではやりたくない)
外部のプログラムでマスタ取得
↓
上記コードの「リンゴ」の部分を書き換えながらforループしつつ実行
でも実現できると思いますが、もしSQLだけで一発でできる書き方があれば知りたいと思って質問しました。
あなたの回答
tips
プレビュー