我想维护一个全局消息列表,这些消息将显示给Web应用程序的所有用户。我希望每个用户能够将这些消息标记为单独阅读。我创建了2个表; messages (id, body)
和messages_read (user_id, message_id)
。
您能提供一个sql语句,为单个用户选择未读消息吗?或者你有什么建议可以更好地处理这个问题吗?
谢谢!
答案 0 :(得分:5)
好吧,你可以用
SELECT id FROM messages m WHERE m.id NOT IN(
SELECT message_id FROM messages_read WHERE user_id = ?)
在哪里?由您的应用传入。
答案 1 :(得分:1)
如果您提到的表格定义已完成,您可能希望为每封邮件添加日期,以便按日期订购。
此外,这可能是一种更有效的方式来进行选择:
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
答案 2 :(得分:0)
类似的东西:
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
稍微有点棘手,我不确定性能如何扩展,但它应该有效。