需要为所有用户和个人消息实施公共消息的传递。
简化表格:
messages
+---------------+---------------------------+
| Field | Type |
+---------------+---------------------------+
| id | int(10) unsigned |
| admin_id | int(10) unsigned |
| type | enum('public','targeted') |
| subject | text |
+---------------+---------------------------+
messages_read_status
+----------------+---------------------------------+
| Field | Type |
+----------------+---------------------------------+
| id | int(10) unsigned |
| message_id | int(10) unsigned |
| user_id | int(10) unsigned |
| status | enum('unread','read') |
+----------------+---------------------------------+
发送 public 消息时 - 在 messages_read_status 表中未创建记录。对于目标消息 - 创建具有未读状态的记录。当用户读取消息时 - 设置读取状态。
客户端的两个过滤器 - 读/未读。消息类型对用户无关紧要。
主要任务 - 创建查询以向用户请求已读或未读邮件,而不管邮件的类型。
主要问题是处理公共未读消息的查询请求,因为 messages_read_status 中没有记录。某些用户在阅读邮件时,UNREAD查询正常工作。然后创建 messages_read_status 中的新记录,其他用户再也看不到此消息。这种情况我无法解决。 READ查询工作正常。
SELECT messages.* FROM messages
LEFT JOIN messages_read_status
ON messages.id = messages_read_status.message_id
WHERE
{OTHER FILTERS} AND
(messages_read_status.`id` IS NULL OR (messages_read_status.`user_id` = $user_id AND messages_read_status.`message_status` = '$message_status'))
samlpe sql - http://sqlfiddle.com/#!2/d940d
谢谢
答案 0 :(得分:1)
获取未读的方式(公开+目标)
SELECT messages.* FROM messages
LEFT JOIN messages_read_status
ON (
messages.id = messages_read_status.message_id AND
messages_read_status.`user_id` = $user_id
)
WHERE
{OTHER FILTERS} AND
((messages_read_status.`id` IS NULL AND messages.type='public') OR messages_read_status.`status` = 'unread')
AND使用更简单的规则进行读取
{OTHER FILTERS} AND messages_read_status.`user_id` = $user_id AND messages_read_status.`status` = 'read'