MySQL与自我表现的多重交集

时间:2013-05-23 22:01:22

标签: mysql performance group-by inner-join intersection

为简单起见,假设我们有一个包含两列的表:uid(用户ID)和水果,描述用户喜欢哪种水果。

E.g:

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慢。

所以,我猜我的问题确实是,是否有第三种方法可以做到以上几点?如果是/否,哪一个最有效?

- 编辑 -

所以,似乎之前已经问过question,与我的相似之处。提供的两个答案实际上是我正在使用的两种方法。

但问题仍然存在。哪一个真的更有效率?可能还有第三个吗?

0 个答案:

没有答案