查询 - 向用户发送公共和私人消息

时间:2012-02-07 18:25:59

标签: mysql sql

需要为所有用户和个人消息实施公共消息的传递。

简化表格:

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

谢谢

1 个答案:

答案 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'