【问题标题】:Fetch unread messages, by user按用户获取未读消息
【发布时间】:2010-09-09 18:04:36
【问题描述】:

我想维护一个将向 Web 应用程序的所有用户显示的全局消息列表。我希望每个用户都能够将这些消息标记为单独阅读。我创建了 2 个表; messages (id, body)messages_read (user_id, message_id)

能否提供一个sql语句,为单个用户选择未读消息?或者您有什么更好的处理方法的建议?

谢谢!

【问题讨论】:

    标签: sql mysql database


    【解决方案1】:

    嗯,你可以使用

    SELECT id FROM messages m WHERE m.id NOT IN(
        SELECT message_id FROM messages_read WHERE user_id = ?)
    

    在哪里?由您的应用传入。

    【讨论】:

      【解决方案2】:

      如果您提到的表格定义是完整的,您可能希望为每条消息添加一个日期,以便您可以按日期对它们进行排序。

      另外,这可能是一种更有效的选择方式:

      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
      

      【讨论】:

        【解决方案3】:

        类似:

        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 
        

        有点棘手,我不确定性能将如何扩大,但它应该可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多