我已经创建了一个简单的聊天和用户搜索系统。在此系统中,当user1向user2请求聊天时,如果聊天线程不存在于user1或user2中,则将自动创建聊天线程,反之亦然。我可以成功地从聊天表中获取聊天线程。下面是用户和聊天表-
用户表
---------------------------
| user_id | user_name |
---------------------------
| 16 | Foo |
---------------------------
| 17 | Bar |
---------------------------
| 20 | John |
---------------------------聊天表
-------------------------------------------
| chat_id | user_one | user_two |
-------------------------------------------
| 1 | 20 | 16 |
-------------------------------------------
| 2 | 20 | 84 |
-------------------------------------------
| 3 | 17 | 16 |
-------------------------------------------我已经实现了一个用户拦截系统。用户阻塞是基于行的。意味着如果用户1阻止了用户2,则两个用户都无法看到对方的个人资料。
块表
-------------------------------------------
| b_id | user_who | user_whom |
-------------------------------------------
| 1 | 16 | 17 |
-------------------------------------------
| 2 | 17 | 20 |
-------------------------------------------以下是当"Foo“请求聊天线程时的查询-
SELECT u.user_id, c.chat_id, user_name
FROM chat c, `user` u
WHERE
(CASE
WHEN c.user_one = '16' THEN c.user_two = u.user_id
WHEN c.user_two = '16' THEN c.user_one = u.user_id
END)
AND (
c.user_one ='16'
OR c.user_two ='16'
)
Order by c.chat_id DESC它将从聊天表中获取两条记录,即chat_id 1和chat_id 3。但我不想显示chat_id 3,因为用户17被用户16阻止。我也想要用户17阻止用户16的相同结果。
问题是,如果用户不在阻止列表中,我不知道如何获取用户聊天线程?
期望的结果:
-------------------------------------------
| user_id | chat_id | user_name |
-------------------------------------------
| 20 | 1 | John |
-------------------------------------------发布于 2021-05-25 14:01:20
考虑以下查询:
SELECT u.user_id, u.user_name, c.user_one, c.user_two
FROM user u
INNER JOIN chat c
ON c.user_one = u.user_id OR
c.user_two = u.user_id
WHERE
u.user_id = 16 AND
NOT EXISTS (SELECT 1 FROM block b
WHERE b.user_who = c.user_one AND b.user_whom = c.user_two OR
b.user_who = c.user_two AND b.user_whom = c.user_one);
在这里,我们根据对话双方的给定用户将user和chat表连接在一起。然后,我们只保留两个用户之间的聊天,这些聊天不会出现在阻止的关系中。
https://stackoverflow.com/questions/67682272
复制相似问题