为简单起见,假设我们有一个包含两列的表:uid(用户 ID)和水果,描述用户喜欢哪种水果。
例如:
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
.
所以,我想我的问题真的是,是否有第三种方法可以完成上述操作?如果是/否,哪一个是最有效的?
- 编辑 -
所以,似乎以前有人问过一个问题,与我的相似。提供的两个答案实际上是我正在使用的两种方法。
但问题仍然存在。哪一个真的更有效率?有没有,也许,第三个?