查找子查询中的所有匹配项

时间:2014-02-18 19:05:28

标签: php mysql sql

假设有一个friends表。它有10个用户。除了自己,每个用户都是其他用户的朋友。

像这样:

+---------+-----------+
| user_id | friend_id |
+---------+-----------+
|   1     |     2     |
+---------+-----------+
|   1     |     3     |
+---------+-----------+
|   1     |     4     |
+---------+-----------+
|   2     |     1     |
+---------+-----------+
|   2     |     3     |
+---------+-----------+
|   2     |     4     |
+---------+-----------+
|   3     |     1     |
+---------+-----------+
|   3     |     2     |
+---------+-----------+
|   3     |     4     |
+---------+-----------+ AND more ....

现在我怎么能得到#1朋友的所有朋友...... (#1朋友的朋友)

我尝试了这个查询:

SELECT friend_id FROM `friends` WHERE user_id = 1

并将它们放入变量$ IN。

SELECT friend_id FROM `friends` WHERE user_id IN ( '$IN' )

但是这没有按预期工作。

EDITED

如果用户#1有100个朋友,而他的每个朋友都有100个朋友。 所以它应该返回9900 ID给我。但它返回99个ID。

任何帮助。感谢。

3 个答案:

答案 0 :(得分:2)

SELECT theirFriends.friend_id
FROM friends AS friendsOfOne
JOIN friends AS theirFriends ON friendsOfOne.friend_id = theirFriends.user_id
WHERE friendsOfOne.user_id = 1

如果您想将1(在本例中为1)作为1的朋友的朋友,请尝试以下操作:

SELECT theirFriends.friend_id
FROM friends AS friendsOfOne
JOIN friends AS theirFriends 
    ON friendsOfOne.friend_id = theirFriends.user_id
    AND theirFriends.friend_id != friendsOfOne.user_id
WHERE friendsOfOne.user_id = 1

答案 1 :(得分:1)

$ IN应该以逗号分隔,并且您的查询不应该在$ IN周围',因为它是一组整数

SELECT friend_id FROM `friends` WHERE user_id IN ($IN)

答案 2 :(得分:1)

您可以将SELECT移至IN

SELECT friend_id FROM `friends` WHERE user_id IN
    (SELECT friend_id FROM `friends` WHERE user_id = 1)

但是有很多行,JOIN可能是更好的解决方案,正如Aquillo所建议的那样。