我正在尝试使用连接启动子选择,但我在返回时遇到问题
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 )
在上面的情况下,返回是好的,但我还有我不想要的所有表用户
第一个查询效果不太好,但我的结果中也有内容。
答案 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)
您当前的查询结果来自两个表格的笛卡尔积:user
和follow
。您需要提供一个将加入并过滤掉连接记录的条件。
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