或INNER JOIN 3表

时间:2017-01-21 17:46:48

标签: mysql

我对此查询有一些问题,我不知道错误在哪里。

SELECT 
DISTINCT(A.email) 
FROM TABLE A 
JOIN TABLE B 
    ON A.id=B.userid
JOIN TABLE C 
    ON A.id=C.userid
WHERE C.sfID = 200 
OR B.sfID = 200

当我在PHPMyAdmin上运行查询时,将永远保持加载状态。

编辑:

以下是试图解释的表格

TABLE A
USERID | EMAIL

TABLE B 
ID | SID | USERID

TABLE C
ID | SID | USERID

TABLE D (i don't want to use this)
SID | SNAME

因此,我需要从表A中获取表B或表C中具有SID 200的用户的电子邮件

1 个答案:

答案 0 :(得分:0)

UNTESTED:

我认为你缺少C上的连接标准,这导致引擎必须加入比它应该更多的记录;或者你可以加入C而不是A而不是A.这只能起作用,因为你在所有情况下都使用INNER Join。如果它们是外连接,我们不能从A-> B-> C

这可能会更快:

SELECT DISTINCT A.email 
FROM TABLE A 
JOIN TABLE B 
  ON A.id=B.userid
JOIN TABLE C 
  ON A.id=C.userid
 AND B.userID = C.USERID
WHERE (C.sfID = 200 OR B.sfID = 200)

A - >乙

A - &以及c

引擎不知道如何绑定B-C,所以如果B和C对A中的每个值都有多个记录,那么你加入M:M,实际上是一个交叉连接。

或者它可以写成:因此加入A - > B - > C

SELECT DISTINCT A.email 
FROM TABLE A 
JOIN TABLE B 
  ON A.id=B.userid
JOIN TABLE C 
  ON B.userID = C.userID
WHERE (C.sfID = 200 OR B.sfID = 200)