我有一张桌子:
| 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)
);