【问题标题】:MySQL left join custom queryMySQL左连接自定义查询
【发布时间】:2014-06-10 07:55:09
【问题描述】:

我有以下表格:

消息

id
thread_id
user_id
comment
timestamp

messages_status

id
message_id
user_id
status

messages 表中的 user_id 标记创建评论的用户的 ID,而 messages_status 表中的 user_id 标记设置状态(即已读/未读)的收件人用户的 ID。

我使用以下查询从线程中检索消息:

SELECT `messages`.*, 
coalesce(messages_status.status, "unread") AS `status` 

FROM `messages` 

LEFT JOIN `messages_status` ON messages_status.message_id = messages.id 
and messages_status.user_id = 143

WHERE (thread_id = '40')

这样,当messages_status表中没有某个message_id和user_id的行时,会返回“未读”。

但是,如果查询中 messages_status.user_id 的值(例如 143)与 messages.user_id 相同(即同一用户创建了评论),则 messages_status 表中没有行,但查询应该返回“read”(如果我是创建评论的用户,显然我也读过它)。

有没有办法创建这样的查询?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如何添加额外的IF 语句,

    SELECT  a.*,
            IF(a.user_ID = 143, 'READ', COALESCE(b.status, 'unread')) AS `status` 
    FROM    messages a
            LEFT JOIN messages_status b
                ON a.id = b.message_id
                    AND b.user_id = 143
    WHERE   a.thread_id = 40
    

    【讨论】:

      【解决方案2】:

      您可以将case 用于此目的

      case 
       when messages_status.status is not null then "read"
       else "unread"
      END as `status`
      

      【讨论】:

        【解决方案3】:

        您可以创建一个触发器,以便在每次发表新评论时触发。

        例子:

        CREATE TRIGGER `AUTO_READ` AFTER INSERT ON `messages`
            INSERT INTO `messages_status`(message_id, user_id, status) VALUES(NEW.id, NEW.user_id, 'read');
        END
        

        这样,每次您插入一条消息时,它会自动在 messages_status 中创建一行,使用用户 ID 来确认发表评论的人已经看到了。

        【讨论】:

          猜你喜欢
          • 2019-08-08
          • 2016-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          • 1970-01-01
          • 1970-01-01
          • 2013-02-25
          相关资源
          最近更新 更多