1

为简单起见,假设我们有一个包含两列的表: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.

所以,我想我的问题真的是,是否有第三种方法可以完成上述操作?如果是/否,哪一个是最有效的?

- 编辑 -

所以,似乎以前有人问过一个问题,与我的相似。提供的两个答案实际上是我正在使用的两种方法。

但问题仍然存在。哪一个真的更有效率?有没有,也许,第三个?

4

0 回答 0