使用一个sql查询选择两行

时间:2014-11-30 15:11:03

标签: php mysql sql multiple-tables

大家好我有这个表结构

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,它应该从f.u_id2返回10而不是8

但如果我输入

ON u.id = f.u_id1 AND u.id = f.u_id2

我将所有结果加倍并且8s

无论如何要在一个查询中完成我需要的东西吗?

正确的回报应该是10,9,1

3 个答案:

答案 0 :(得分:2)

此查询不需要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

答案 1 :(得分:0)

@Konter根据您最近对Gordon建议的评论,您可能正在寻找类似

的内容
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
;

答案 2 :(得分:0)

这适用于用户名

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;