我有一张桌子:

| friendID | friendA | friendB | relation |
-------------------------------------------
     1          2         4          1
     2          3         4          1
     3          4         8          2
     4          4         9          1


我想运行一个查询,以便可以检索不是当前登录用户的朋友列表,例如,如果我以用户4身份登录,则希望有用户2、3、8和9的列表。

当前,我在一个查询中拉回一个列表,该列表中的friendA或friendB中的ID为4:

SELECT forename, surname
FROM entity
LEFT JOIN friends
ON entity.fb_id = friends.friendA
WHERE friendA = :entity_id
OR    friendB = :entity_id
UNION
SELECT forename, surname
FROM entity
LEFT JOIN friends
ON entity.fb_id = friends.friendB
WHERE friendA = :entity_id
OR    friendB = :entity_id


该查询将拉回该用户的所有朋友,但是由于比较是使用登录的用户ID完成的,因此我得到了该用户的重复列表,但该列表不正确。

如何从列中提取朋友ID,然后获取每一行的朋友信息?

最佳答案

我认为您可以简化查询以获取所需内容:

SELECT forename, surname
FROM entity LEFT JOIN
     friends
     ON entity.fb_id = friends.friendA
WHERE friendB = :entity_id
UNION
SELECT forename, surname
FROM entity LEFT JOIN
     friends
     ON entity.fb_id = friends.friendB
WHERE friendA = :entity_id;


WHERE条件在另一个朋友列上。

这是另一种写法:

SELECT e.forename, e.surname
FROM entity e
WHERE EXISTS (SELECT 1
              FROM Friends f
              WHERE (e.fb_id = f.friendA and f.friendB = :entity_id) OR
                    (e.fb_id = f.friendB and f.friendA = :entity_id)
             );

10-04 12:26
查看更多