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