我想维护一个全局消息列表,该列表将显示给Web应用程序的所有用户。 我希望每个用户都可以将这些消息标记为单独阅读。 我创建了2个表; messages (id, body)
和messages_read (user_id, message_id)
。
您能否提供一个sql语句来选择单个用户的未读消息? 还是您对解决此问题有任何建议?
谢谢!
好吧,你可以使用
SELECT id FROM messages m WHERE m.id NOT IN(
SELECT message_id FROM messages_read WHERE user_id = ?)
在哪 由您的应用传递。
如果您提到的表定义是完整的,则可能要为每条消息包括一个日期,以便可以按日期对它们进行排序。
另外,这可能是执行选择的一种稍微有效的方法:
SELECT id, message
FROM messages
LEFT JOIN messages_read
ON messages_read.message_id = messages.id
AND messages_read.[user_id] = @user_id
WHERE
messages_read.message_id IS NULL
就像是:
SELECT id, body FROM messages LEFT JOIN
(SELECT message_id FROM messages_read WHERE user_id = ?)
ON id=message_id WHERE message_id IS NULL
有点棘手,我不确定性能如何提高,但应该可以。