【问题标题】:MySQL query for counting users unread message用于计算用户未读消息的 MySQL 查询
【发布时间】:2017-07-10 23:07:35
【问题描述】:

我正在将通知消息发送到多个设备用户可以从多个设备登录。我有单独的表来维护每个用户的设备 ID。当我发送通知时,我将在 message_data 上添加一个包含用户 ID、消息等的条目,我将在每个用户设备的 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 的 message_status,因此请使用 JOIN 或 NOT EXISTS 和 WHERE device_id = <devid> AND status = <read>
  • @mroman 我需要按用户 ID 获取未读消息数。用户可以拥有多个注册设备。
  • user_id 是唯一的吗?
  • @Fabio 我可以向同一个用户发送多条通知消息,message_data 表的用户ID 字段不是唯一的。

标签: mysql join


【解决方案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

【讨论】:

  • 有效,但如果您引入除已读/未读之外的其他状态,则会有风险。
  • @wajeeh 会导致,特定用户的未读消息计数吗?
  • 风险不大,因为status 字段只能是10,正如他所要求的那样。 @mroman
  • @Kaleeswaran 现在很重要,您可以删除最后一个 having 条件以查看所有有或没有未读消息的用户。
  • @wajeeh 如果我为读取状态指定 4,我如何识别“has_un_read”和“unread_messages_count”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多