用于计算未读消息的MySQL查询

时间:2016-10-22 12:28:22

标签: mysql

我花了两天时间让这个查询起作用,但最后......它无法正常工作。所以我有我的用户的消息系统,对于这个系统,我有两个表。消息和消息。 表 MESSAGES 包含以下列:

ID | message_body_last | user_from | user_to | user_seen_status

栏目解释:

  • MESSAGE_BODY_LAST->用户发送给的最后一条消息 其他
  • USER_TO - >消息发送给用户......
  • USER_FROM - >消息是从......发送的。
  • USER_SEEN_STATUS->如果从user_to看到,我将值1,默认值为0.每次有人发送消息时 另一方面,我正在改变user_from和user_to的值 时间,当有人向其他用户发送消息和列时 user_seen_status是与user_to列的组合,用于检查是否 用户看到了消息。此表是消息的标题。

表messages_body是我在用户之间放置所有对话的表。

表格 MESSAGES_BODY 包含以下列:

ID | MESSAGE_ID | MESSAGE_BODY | USER_FROM | USER_TO | USER_FROM_DELETE | USER_TO_DELETE

专栏解释:

  • ID - AI字段。
  • MESSAGE_ID是MESSAGES.ID
  • 的foreign_key
  • MESSAGE_BODY - 消息文本
  • USER_TO - 发送消息USER_FROM - 来自谁是消息
  • USER_FROM_DELETE - 如果有人删除了某些消息或所有消息,我会将用户的ID放在此处。
  • USER_TO_DELETE - 这是相同的字段。

所以,问题是:我想要计算新消息的数量。新消息是,如果我是ID为56的用户(这是我的测试ID), 我得检查一下。 messages.user_to是56而user_seen_status是0,但是我必须检查另外一种情况。在表MESSAGES_BODY中,USER_FROM_DELETE列和USER_TO_DELETE列不包含我的ID(56)。因为如果我删除了这些消息,那么从其他用户那里计算新消息是没有意义的。

这是我的疑问:

SELECT messages.id, (SELECT COUNT(*) 
FROM messages 
WHERE user_to = 56
AND user_seen_status = 0 ) as count_new_messages 
FROM messages
LEFT JOIN messages_body
ON messages_body.message_id = messages.id 
WHERE messages.user_to = 56
AND   messages.user_seen_status = 0
AND  ( messages_body.user_from_delete <> 56
AND   messages_body.user_to_delete <> 56)

查询正在运行,但是如果我只有一个会话...(在表MESSAGES中,我只有一行,用户之间的每个会话在MESSAGES表中是一行,MESSAGES_BODY中有很多行) 如果我有更多的那个对话,COUNT(*)函数返回两行,数据相同,如果第二个会话处于已删除状态并不重要,他会向我显示两条新消息。

如何获取新邮件的实数?

1 个答案:

答案 0 :(得分:-1)

[<强>解决

5分钟后更多,我得到了我的错误。我在计算MESSAGES表中的行,而不是来自MESSAGES_BODY。 这是我的工作查询,没有子查询。

SELECT messages.id, COUNT(messages_body.id) as count_value
                                FROM messages
              LEFT JOIN messages_body
                  ON messages_body.message_id = messages.id 

              WHERE messages.user_to = 56
                AND   messages.user_seen_status = 0
                AND   messages_body.user_from_delete <> 56
                AND   messages_body.user_to_delete <> 56

现在正是我想要的。