簡単にするために、uid (ユーザー ID) とフルーツの 2 つの列を持つテーブルがあり、ユーザーが好きな種類の果物を記述しているとします。
例えば:
uid | fruit
----|------------
1 | Strawberry
1 | Orange
2 | Strawberry
2 | Banana
3 | Watermelon
など。
N 人の特定のユーザーに共通する果物の種類 (つまり、テーブルとそれ自体の N 回の交差) を見つけたい場合、最初のオプションは を使用することINNER JOINです。
SELECT DISTINCT fruit FROM Fruits f1
INNER JOIN Fruits f2 USING (fruit)
INNER JOIN Fruits f3 USING (fruit)
...
INNER JOIN Fruits fN USING (fruit)
WHERE f1.uid = 1 AND f2.uid = 2 ... AND fN.uid = M
しかし、この種の私にはばかげているように見えます。N = 10 の場合はどうなるでしょうか。または20?20回の結合を行うのは賢明ですか? 私が見逃している他の結合操作はありますか?
結合の「魔法」を学ぶ前に、次のように現在のケースに適用される別の方法を使用しました。
SELECT DISTINCT fruit FROM Fruits
WHERE uid IN (1, 2, ..., M)
GROUP BY fruit
HAVING COUNT (*) = N
はるかにコンパクトに見えGROUP BYますが、INNER JOIN.
だから、私の質問は本当に、上記を行うための3番目の方法はあるのでしょうか? はい/いいえの場合、どちらが最も効率的ですか?
- 編集 -
それで、私の質問に似た質問が以前に尋ねられたようです。提供された2つの答えは、実際に私が使用している2つの方法です。
しかし、疑問は残ります。どちらが本当に効率的ですか?たぶん、3番目のものはありますか?