如何从mysql获取未读消息

Posted

技术标签:

【中文标题】如何从mysql获取未读消息【英文标题】:How to get unread message from mysql 【发布时间】:2015-09-28 12:05:14 【问题描述】:

消息被广播给用户。所以只在更新表中创建一条消息记录。

table name : updates
id : 
title : message
user_id : created user id

table name : message _status
id
message_id
user_id : read by user

如果任何用户阅读了消息,我们会在 updates_status 表中进行条目。

我想显示当前用户未创建且未读的未读消息列表。这是我的查询:

select u.*, s.user_id as status_user, s.id 
 from updates as u left outer join update_status as s ON u.id=s.update_id 
 where u.user_id != 1 and (s.user_id is null or s.user_id  != 1)

我得到 6 条记录而不是 5 条。

这是来自fiddle 的 DDL:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `u_name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `u_name`) VALUES
(1, 'Praveen'),
(2, 'Ravi'),
(3, 'Ram'),
(4, 'Mohan');

CREATE TABLE IF NOT EXISTS `updates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `updates`
--

INSERT INTO `updates` (`id`, `title`, `user_id`, `created`) VALUES
(1, 'message1', 2, '2015-09-28 15:50:38'),
(2, 'message2', 2, '2015-09-28 15:50:38'),
(3, 'message3', 1, '2015-09-28 17:00:37'),
(4, 'message4', 1, '2015-09-28 17:00:37'),
(5, 'message5', 3, '2015-09-28 17:05:21'),
(6, 'message6', 4, '2015-09-28 17:05:21');

CREATE TABLE IF NOT EXISTS `update_status` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `update_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `update_status`
--

INSERT INTO `update_status` (`id`, `update_id`, `user_id`, `created`) VALUES
(2, 1, 1, '2015-09-28 17:02:15'),
(3, 3, 2, '2015-09-28 17:04:16'),
(4, 1, 3, '2015-09-28 17:06:24'),
(5, 1, 4, '2015-09-28 17:06:33'),
(6, 3, 3, '2015-09-28 17:17:12');

【问题讨论】:

我想获取当前用户的未读消息。 请发布您发布的相关值的最终结果应该如何? 我想要创建此消息的 update.id、update.title 和用户名 【参考方案1】:

更改为排除用户自己的更新

SELECT Updates.id 
FROM Updates 
JOIN Users 
ON Updates.user_id != Users.id and Users.id = 1 -- CURRENT USER ID
LEFT JOIN Update_status 
ON Users.id = update_status.user_id 
and updates.id = update_status.id 
WHERE update_status.created is null 
ORDER BY updates.created desc

返回

id
--
5
6
1

【讨论】:

这里3、4行没看懂。它应该排除当前用户创建的消息。 SELECT Updates.*,Users.u_name FROM Updates JOIN Users ON Updates.user_id = Users.id 和 Users.id != 3 LEFT JOIN Update_status ON updates.id = update_status.id WHERE update_status.created为 null 或 update_status.user_id != 3 ORDER BY updates.created desc 这给出了正确的结果。但我想跳过那些我已经读过的消息。 在你的结果中应该是 skippe ,因为它已经被阅读了。 您希望在查询中返回什么,因为您似乎已将查询更改为查看所有用户但不查看用户 3,并且如果用户 3 已阅读某些内容则不返回,这让我感到困惑,就像在我的查询只需将 user.id = 1 改为 user.id = 3 即可返回用户 3 的未读消息。 在 Update_status 表中,我使用已阅读的 user_id 存储消息 ID。结果我想显示从其他人发送但用户未阅读的消息列表(例如:userid =1)

以上是关于如何从mysql获取未读消息的主要内容,如果未能解决你的问题,请参考以下文章

未读消息总数 quickblox

mysql中未读消息的数据库设计?

如何使用 Graph API 获取未读消息?

将*单个* IMAP 邮件标记为未读

MailCore2,只获取未读消息,或者知道哪些是未读消息

仅从 QuickBlox 获取未读消息?