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

时间:2017-02-21 10:57:25

标签: mysql join

向多个设备发送通知消息用户可以从多个设备登录。我有单独的表来维护每个用户的设备ID。当我发送通知时,我将使用userid,message等在message_data上放置一个条目。,我将在message_status表中为每个用户设备添加一个条目。

这样我就可以维护每个设备通知发送状态并出错。

message_data
id          INT     
userid      VARCHAR
message     VARCHAR
sent_time   DATETIME
language    TINYINT

message_status
id              INT
data_id         INT
device_id       VARCHAR
device_type     TINYINT
sent_time       DATETIME
status          TINYINT
error_code      TINYINT (If there is any error, we will have the error code here)

我想获取每个用户的未读通知消息计数。状态字段0表示,此设备的消息尚未被用户读取。如果是1,则用户已阅读该消息。

用户可以从多个设备登录,如果用户在至少一个设备上阅读该消息,则应将其视为已读取通知消息。

如果用户未在任何设备中读取通知消息,则需要将其视为未读消息。

如何识别未读通知消息计数的用户?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Select
  m.*, -- m.user_id
  IF (SUM(s.status) > 0, 1, 0) has_un_read,
  SUM(s.status) unread_messages_count
From message_data m
INNER JOIN message_status s on m.id = s.data_id
Group By m.id
having SUM(s.status) > 0

如果status字段包含01以外的多个州,那么您可以这样做:

Select
  m.*,
  IF(SUM(IF(s.status = 1, 1, 0)) > 0, 1, 0) has_un_read,
  SUM(if(s.status = 1, 1, 0)) unread_messages_count
From message_data m
INNER JOIN message_status s on m.id = s.data_id
Group By m.id

<强>更新

如果您想区分来自每个设备的未读取消息:

Select
  m.*,
  s.device_id,
  IF (SUM(s.status) > 0, 1, 0) has_un_read,
  SUM(s.status) unread_messages_count
From message_data m
INNER JOIN message_status s on m.id = s.data_id
Group By m.id, s.device_id
having SUM(s.status) > 0