大家好,我有这个表结构
id | u_id2 | u_id2
1 | 8 | 10
2 | 10 | 1
3 | 9 | 8
4 | 1 | 8
使用此sql查询,它尝试将每个带有8的朋友关系作为user_id
SELECT
u.id
FROM up2_users u
RIGHT JOIN up2_friends f
ON u.id = f.u_id1
WHERE f.u_id1 = :user_id OR f.u_id2 = :user_id
结果还可以,但不完全正确。:user_id = 8
8, 9 , 1
您在上表中看到 8 是 :user_id,它应该返回 10 而不是 8 from f.u_id2
但是如果我输入
ON u.id = f.u_id1 AND u.id = f.u_id2
我得到所有结果加倍和 8s
无论如何都可以在单个查询中完成我需要的内容吗?
正确的返回值应为 10、9、1
此查询不需要join
。 您确实希望有条件地返回其他用户 ID,因此请使用case
:
SELECT (case when f.u_id1 = :user_id then f.u_id2 else f.u_uid1 end) as id
FROM up2_friends f
WHERE f.u_id1 = :user_id OR f.u_id2 = :user_id;
如果您不想要重复项,请使用 select distinct
.
这适用于用户名
SELECT (case when f.u_id1 = :user_id then f.u_id2 else f.u_id1 end) as id,
u.username
FROM up2_friends f
RIGHT JOIN up2_users u
ON u.id=f.u_id1
WHERE f.u_id1 = :user_id OR f.u_id2 = :user_id
ORDER BY u.username;
@Konter 根据你最近对戈登建议的评论,你可能正在寻找类似的东西
SELECT
u.id
, Friendship.friend2 friend
FROM up2_users u
JOIN (SELECT u_id1 friend1, u_id2 friend2 FROM Friend
UNION ALL
SELECT u_id2, u_id1 FROM Friend) Friendship
ON u.id = Friendship.friend1
WHERE u.id = 8
ORDER BY friend1, friend2
;