2014-11-21 49 views
1

我得到这个查询工作问题未读邮件数,因此其基本思想是:获取与加入

  • 我有消息表,我想跟踪用户是否已阅读邮件或没有。注:多个用户可以收到同样的消息,所以读消息只需添加列是不是一种选择
  • 每个消息是在一个线程(有一栏的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。如果有更好的想法如何建模,请让我知道!

回答

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; 
+0

这是最奇怪的查询我所见过的,但它的工程!你能详细解释一下吗? (将尽快接受:)) – user50992 2014-11-21 17:33:37

+0

我添加了一个解释。希望有帮助。 – Tom 2014-11-21 17:34:17

+0

是的,它有一点帮助,我可以问为什么有1337 AS user_id?它也可以没有它。哦,我明白了,我甚至不知道在ON声明后我可以做比1更多的比较。 – user50992 2014-11-21 17:35:46

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)