如何获取我的朋友列表以及所有用户 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
连接 users
到 friends
:
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.
我无法将我的好友列表与所有用户一起列出
我用这条语句列出了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
连接 users
到 friends
:
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.