【发布时间】:2010-09-09 18:04:36
【问题描述】:
我想维护一个将向 Web 应用程序的所有用户显示的全局消息列表。我希望每个用户都能够将这些消息标记为单独阅读。我创建了 2 个表; messages (id, body) 和 messages_read (user_id, message_id)。
能否提供一个sql语句,为单个用户选择未读消息?或者您有什么更好的处理方法的建议?
谢谢!
【问题讨论】:
我想维护一个将向 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
有点棘手,我不确定性能将如何扩大,但它应该可以工作。
【讨论】: