按用户获取未读消息

时间:2020-03-05 18:57:06  来源:igfitidea点击:

我想维护一个全局消息列表,该列表将显示给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, body FROM messages LEFT JOIN
  (SELECT message_id FROM messages_read WHERE user_id = ?)
  ON id=message_id WHERE message_id IS NULL

有点棘手,我不确定性能如何扩展,但是应该可以。

回答

如果我们提到的表定义是完整的,则可能要为每条消息包括一个日期,以便可以按日期对它们进行排序。

此外,这可能是执行选择的一种更有效的方法:

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