【问题标题】:How to exclude blocked user from user chat and user search如何从用户聊天和用户搜索中排除被阻止的用户
【发布时间】:2021-05-25 05:33:53
【问题描述】:

我创建了一个简单的聊天和用户搜索系统。在此系统中,当 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    |
 -------------------------------------------

【问题讨论】:

    标签: mysql


    【解决方案1】:

    考虑以下查询:

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

    Demo

    在这里,我们根据会话两侧出现的给定用户将userchat 表连接在一起。然后我们只保留两个用户之间没有出现在被阻止关系中的聊天。

    【讨论】:

    • 从上面的代码中,我得到了正确的聊天 id,即 chat_id 1。但是,我得到的不是用户名 john 的用户 id 20,而是用户 id 为 16 的用户 'foo'。跨度>
    • 好吧,我只在您的问题中使用了相同的选择子句。如果您不想要我的答案的输出,请编辑您的问题并包含预期的输出。
    • 感谢您的评论。但是如果你运行我上面的查询,除了我没有添加到用户表中的 user_uid,你会得到 Bar 和 John。我只是想删除“酒吧”,因为用户阻止了他。
    • @AshisBiswas 我想我现在明白了。如果 16 阻止了 17,那么他不想看到来自 17 的任何消息(但不一定反之亦然)。检查更新的答案和演示。
    • 我已经添加了所需的结果并删除了不必要的 'user_uid'。我清楚地提到该块基于一行。这意味着用户 a 可以阻止 b 或用户 b 可以阻止 a。对于这两种情况,没有用户可以看到聊天线程。
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2012-11-20
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2013-01-31
    相关资源
    最近更新 更多