如何获取我的朋友列表以及所有用户 is_friend 列值 0 1

how to get my friend list along with all users with is_friend column value 0 1

我无法将我的好友列表与所有用户一起列出

我用这条语句列出了user_id1的所有好友列表:

SELECT users.user_id, username, full_name, avatar, user_type, last_active FROM users JOIN user_active ua on users.user_id = ua.user_id WHERE users.user_id IN( (SELECT user_id1 FROM friends WHERE user_id2 = 1) UNION (SELECT user_id2 FROM friends WHERE user_id1 = 1)) AND users.status = 1;

我也可以使用此语句查找 user_id 1 的朋友列表以及所有人,但现在有办法识别谁是我的朋友列表或谁不在我的朋友列表中:

SELECT users.user_id, username, full_name, avatar, user_type, last_active FROM users JOIN user_active ua on users.user_id = ua.user_id WHERE users.user_id IN( (SELECT user_id1 FROM friends WHERE user_id2 = 1) UNION (SELECT user_id2 FROM friends WHERE user_id1 = 1)) OR users.user_id != 1  AND users.status = 1;

好友详情table:

+------------+---------------+----+---+-----------------+-----------------+
|Field       |Type           |Null|Key|Default          |Extra            |
+------------+---------------+----+---+-----------------+-----------------+
|f_request_id|bigint unsigned|NO  |PRI|NULL             |auto_increment   |
|user_id1    |bigint         |NO  |   |NULL             |                 |
|user_id2    |bigint         |NO  |   |NULL             |                 |
|created_at  |timestamp      |NO  |   |CURRENT_TIMESTAMP|DEFAULT_GENERATED|
+------------+---------------+----+---+-----------------+-----------------+

如果你们能帮我在结果上加一个额外的列,比如is_friend,值包含0或1,0代表朋友,1代表朋友,我将不胜感激。 提前致谢

使用 LEFT 连接 usersfriends:

SELECT u.*, 
       COALESCE(NULLIF(f.user_id1, ?), f.user_id2) IS NOT NULL is_friend
FROM users u LEFT JOIN friends f
ON u.user_id IN (f.user_id1, f.user_id2) AND ? IN (f.user_id1, f.user_id2)
WHERE u.user_id <> ? AND u.status = 1;

将出现的 3 次占位符 ? 更改为您要获取结果的用户 ID。

如果您得到重复的结果,因为 table friends 可能包含 2 行相同的 friendship(例如 (1,2) 和 (2 ,1)) 然后使用 SELECT DISTINCT u.* .....

或者,使用 EXISTS:

SELECT u.*, 
       EXISTS (
         SELECT * 
         FROM friends f 
         WHERE u.user_id IN (f.user_id1, f.user_id2) AND ? IN (f.user_id1, f.user_id2)
       ) is_friend
FROM users u 
WHERE u.user_id <> ? AND u.status = 1;

查看简化版 demo.