我在使这个查询起作用时遇到问题,所以基本的想法是:
user_read_message
,只要有人阅读邮件,就会添加记录(user_id
,message_id
,read
)我想获取特定线程中用户的未读消息数。我正在尝试这些方面的东西,但我无法让它工作:
SELECT m.thread_id, urm.user_id, urm.read
FROM sup_messages as m
LEFT OUTER JOIN user_read_message as urm ON m.id = urm.message_id
WHERE m.thread_id = 76852 AND urm.user_id = 1337;
如果它工作了,那么选择thread_id 76852中的所有消息然后加入user_read_message
user_id
为1337,而他未读取的消息将只有null
。然后我会以某种方式计算读数为0或NULL
的位置。
PS。如果有更好的想法如何建模,请告诉我!
答案 0 :(得分:1)
我会这样做。将与user_read_message表相关的WHERE
子句添加到该表的JOIN
中。由于这是LEFT JOIN
,如果没有匹配项,则从该表返回的所有字段都将为NULL
。将该表中的字段添加到始终填充的WHERE
子句中,然后检查它是否为NULL
。这意味着没有匹配。
SELECT m.thread_id, 1337 AS user_id, COUNT(*) unread_messages
FROM sup_messages as m
LEFT OUTER JOIN user_read_message as urm
ON m.id = urm.message_id
AND urm.user_id = 1337
WHERE m.thread_id = 76852 AND urm.message_id IS NULL;
答案 1 :(得分:0)
SELECT COUNT(*)
FROM sup_messages
WHERE sup_messages.thread_id = 76852 AND
sup_messages.id IN (SELECT DISTINCT urm.message_id
FROM urm
WHERE urm.user_id = 1337 AND urm.read = 0)