我有以下表格:
讯息:
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" (如果我是创建评论的用户,显然我也读过它。)
有没有办法创建这样的查询?
答案 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`