获取我最近收到消息的用户列表Mysql

时间:2017-12-04 06:50:08

标签: mysql

这是'消息'表

---------------------------------
id  | sender  | receiver | seen |
---------------------------------
1   | john    |  jane    | 0    |   
2   | john    |  jane    | 1    |
3   | dave    |  john    | 0    |   <- John has received one unseen msg
4   | john    |  dave    | 1    |
5   | john    |  rose    | 0    |

我需要获得john与之互动的用户列表。如果john收到任何未见的消息,我需要突出显示该消息。

我试过了:

SELECT  DISTINCT 
        CASE WHEN sender = 'john' 
            THEN receiver
            ELSE sender 
        END userID
FROM    messages
WHERE   'john' IN (sender, receiver)

输出:

|jane|
|dave|
|rose|

预期产出:

userID|seen|
|dave |  0 |
|jane |  1 |
|rose |  0 |

1 个答案:

答案 0 :(得分:0)

你的问题不太清楚,所以在提供答案之前我会尝试解释它。

我相信,您希望向用户提供与对方对话的对话概述,突出显示特定用户有未读消息的对应方。

这意味着,如果特定用户收到来自对方的消息(未读取),则查询应返回0.在任何其他情况下,查询应返回1.这也意味着,如果特定用户仅发送一条未读的邮件,则查询仍应返回1.

SELECT
    CASE WHEN sender = 'john' THEN receiver ELSE sender END as userID,
    COALESCE(MIN(CASE WHEN receiver = 'john' THEN seen ELSE null END), 1) AS seen
FROM messages
WHERE
    receiver = 'john' or sender = 'john'
GROUP BY
    CASE WHEN sender = 'john' THEN receiver ELSE sender END;

只是解释代码的主要部分COALESCE(MIN(CASE WHEN receiver = 'john' THEN seen ELSE null END), 1)

  1. case确保计算仅针对收到的消息运行。
  2. min()确保如果来自对方的未保留消息,则表达式返回0.
  3. coalesce()会照顾那些没有向当前用户发送任何消息的交易对手。在这种情况下,返回值为1,以确保未突出显示对应项。