回答編集履歴

1 追記

Kosuke_Shibuya

Kosuke_Shibuya score 17615

2018/06/10 04:39  投稿

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る