通过加入获取未读数

时间:2014-11-21 17:22:17

标签: mysql sql

我在使这个查询起作用时遇到问题,所以基本的想法是:

  • 我有留言表,我想跟踪用户是否已阅读留言。注意:多个用户可以接收相同的消息,因此只需添加列读取消息不是一个选项
  • 每条消息都在一个线程中(有一个列thread_id)
  • 我有另一个表user_read_message,只要有人阅读邮件,就会添加记录(user_idmessage_idread

我想获取特定线程中用户的未读消息数。我正在尝试这些方面的东西,但我无法让它工作:

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。如果有更好的想法如何建模,请告诉我!

2 个答案:

答案 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)