使用一个 sql 查询选择两行


Select two rows with one sql query

大家好,我有这个表结构

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
;