SQL:根据当前用户获取好友栏的值

SQL: Get the value of friend column based on current user

我有一个 table:

| 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)
             );

在查询的两个部分中,您都使用 OR 来询问:"give me the user or his/her friend"。删除 OR 子句以便仅获取朋友,仅此而已。但是,这样的查询可以写得更简单、更易读:

select forename, surname
from entity
where fb_id in
(
  select friendA from friends where friendB = :entity_id
  union all
  select friendB from friends where friendA = :entity_id
);