子查询和加入

时间:2013-03-30 10:15:41

标签: mysql sql select join

我正在尝试使用连接启动子选择,但我在返回时遇到问题

SELECT * FROM user, follow
WHERE user.id IN ( SELECT follow FROM referent_follow WHERE referent=3 )

在上面的情况下,回报是好的,但我还有我的表,我不想要

SELECT * FROM user, follow
WHERE follow.user_id IN ( SELECT follow FROM referent_follow WHERE referent=3 )

在上面的情况下,返回是好的,但我还有我不想要的所有表用户

第一个查询效果不太好,但我的结果中也有内容。

2 个答案:

答案 0 :(得分:1)

FROM A,B表示A和B的交叉连接。因此A中的每一行都与每一行B
匹配 (所以totalRows = rowCount(A)*rowCount(B))。

使用(INNER) JOIN应该有效:

SELECT *
FROM user
JOIN follow ON user.id = follow.user_id
  AND user.id IN ( SELECT follow FROM referent_follow WHERE referent=3 )

建议使用JOIN而不是IN,因为它通常会带来更好的效果:

SELECT user.*, follow.*
FROM user
JOIN follow ON user.id = follow.user_id
JOIN referent_follow ON user.id = referent_follow.follow
WHERE referent=3

您可能还需要JW建议的DISTINCT

答案 1 :(得分:1)

您当前的查询结果来自两个表格的笛卡尔积:userfollow。您需要提供一个将加入并过滤掉连接记录的条件。

SELECT  DISTINCT a.*, b.* 
FROM    user a
        INNER JOIN follow b
            ON a.ID = b.user_id 
        INNER JOIN referent_follow c
            ON a.ID = c.follow
WHERE   c.referent = 3