簡単にするために、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番目のものはありますか?