我正在编写一个友谊系统,它有两个表。
成员信息
朋友
假设我想要一个可以选择成员$ userId的朋友ID的查询,如何在一个查询中进行此操作?
我找到了一个可以进行2次查询的解决方案。第一个选择朋友WHERE user_id = $userId
,第二个选择朋友WHERE friend_id = $userId
,然后将它们混合在一个数组中。如果没有其他解决方案,我将使用它。
请对SQL结构和&amp ;;疑问?
答案 0 :(得分:4)
使用:
SELECT f.friend_id
FROM FRIENDS f
WHERE f.user_id = $user_id
UNION
SELECT t.user_id
FROM FRIENDS t
WHERE t.friend_id = $user_id
使用UNION
将删除重复项。 UNION ALL
会更快,但不会删除重复项。
如果您想从MEMBERS
表中获取朋友的信息,请使用:
SELECT m.*
FROM MEMBERS m
JOIN (SELECT f.friend_id 'user_id'
FROM FRIENDS f
WHERE f.user_id = $user_id
UNION
SELECT t.user_id
FROM FRIENDS t
WHERE t.friend_id = $user_id) x ON x.user_id = m.id
BTW:我希望你对变量使用mysql_escape_string,否则会冒SQL注入攻击的风险:
答案 1 :(得分:1)
您应该可以尝试使用
SELECT m.*
FROM friends f INNER JOIN
members m ON f.friend_id = m.user_id
WHERE f.user_id = $userId
这将为您提供所有朋友详细信息
要两个人看看
SELECT DISTINCT CASE WHEN f.user_id = $userId then f.friend_id else f.user_id END CASE
FROM friends f
WHERE f.user_id = $userId
OR f.friend_id = $userId
答案 2 :(得分:1)
为什么不为1个友谊插入2行。例如:
假设我们有2位用户将成为朋友
User_id:1& Friend_id:2
insert into friends (user_id, friend_id, status) values (1,2,0)
insert into friends (user_id, friend_id, status) values (2,1,0)
因此您可以通过简单的选择查询轻松选择。
此外,它还可以缓解您下一个问题“如何找到共同朋友”的痛苦。
答案 3 :(得分:0)
因为你要求的东西很简单:
SELECT friend_id FROM friends WHERE user_id = id; [fill in the id]
我会给你一些更高级的东西:
SELECT * FROM members AS m
WHERE m.id
IN (SELECT f.friend_id FROM friends AS f
WHERE f.user_id = (SELECT pm.id FROM members AS pm
WHERE pm.username = 'amindzx'));
使用子查询的连接更好。
此外,朋友列中不需要id
,因为user_id
和friend_id
之间只存在一个关系;这些都可以统一描述为id
列。