MySQL离开了加入自定义查询

时间:2014-06-10 07:55:09

标签: mysql

我有以下表格:

讯息

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')

这样,当某个message_id和user_id的messages_status表中没有行时,它将返回" unread"。

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以创建每次发表新评论时触发的触发器。

示例:

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,以确认发表评论的人已经看到了。

答案 2 :(得分:0)

您可以使用case作为

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