要件が不十分なので、とりあえず書いてあることを最低限満たすもの。
sql
1SELECT user_id, group_concat(`value`), count(DISTINCT `value`) FROM favo
2GROUP BY user_id
3HAVING count(`value`) >= 3
4ORDER BY count(DISTINCT `VALUE`) desc
取得するデータはfavoテーブルのuser_idを2つ取得する
例示されたサンプルでは、結果2件のみ抽出されるので、例外は考慮していません。
リンゴ、バナナ、オレンジ、パイナップルの全てが登録されているuser_idを取得
項目がこの4つ以外にあるのかどうか書かれていないので、count(value) で書いた。
(3.)の条件を満たすデータが無い場合、リンゴ、バナナ、オレンジの3つが登録されているuser_idを取得する
項目はマスター化(正規化)すべきかと思う。「パイナップル」を除外すべき理由が不明なので、考慮していない。項目にそれを識別するフィールドがあってしかるべきかと。
他の回答者のため、
sql
1CREATE TABLE `favo` (
2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3 `user_id` int(11) unsigned NOT NULL,
4 `value` varchar(32) NOT NULL DEFAULT '',
5 PRIMARY KEY (`id`)
6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
sql
1INSERT INTO `favo` (`id`, `user_id`, `value`)
2VALUES
3 (1,1,'リンゴ'),
4 (2,1,'バナナ'),
5 (3,2,'リンゴ'),
6 (4,2,'バナナ'),
7 (5,2,'オレンジ'),
8 (6,3,'リンゴ'),
9 (7,3,'バナナ'),
10 (8,3,'オレンジ'),
11 (9,3,'パイナップル');
本来、質問者がこうやって情報を提示してくれると回答しやすいんだけどね〜
2018/06/10 02:13 編集
2018/06/10 04:23 編集