检查线程的最后发送者和更新状态
Checking last sender of a thread and update status
我有两张桌子
留言
id ,thread_id ,sender_id ,message_content
1. 10. 2. message_content_1
2. 5. 1 message_content_2
线程
id status
5. close
10. Open
我想要实现的是,如果最新的 send_id!=1(又名不是管理员)> 我想更新线程状态以打开。
到目前为止我做了什么
UPDATE thread
SET thread.status=open
RIGHT JOIN message
ON thread.id=message.thread_id
WHERE message.senderId!=1 AND (SELECT max(message.id) FROM message WHERE message.thread_id=thread.id)
我做错了什么?
我希望这会奏效。
update thread join message on thread.id=message.thread_id set thread.status='open' where message.sender_id!=1 and (SELECT max(message.id) FROM message);
使用 FIRST_VALUE()
window 函数为每个 thread_id
获取最后一个 sender_id
:
UPDATE thread t
INNER JOIN (
SELECT DISTINCT thread_id,
FIRST_VALUE(sender_id) OVER (PARTITION BY thread_id ORDER BY id DESC) sender_id
FROM message
) m ON m.thread_id = t.id
SET t.status = 'open'
WHERE m.sender_id <> 1;
参见demo。
我有两张桌子
留言
id ,thread_id ,sender_id ,message_content
1. 10. 2. message_content_1
2. 5. 1 message_content_2
线程
id status
5. close
10. Open
我想要实现的是,如果最新的 send_id!=1(又名不是管理员)> 我想更新线程状态以打开。
到目前为止我做了什么
UPDATE thread
SET thread.status=open
RIGHT JOIN message
ON thread.id=message.thread_id
WHERE message.senderId!=1 AND (SELECT max(message.id) FROM message WHERE message.thread_id=thread.id)
我做错了什么?
我希望这会奏效。
update thread join message on thread.id=message.thread_id set thread.status='open' where message.sender_id!=1 and (SELECT max(message.id) FROM message);
使用 FIRST_VALUE()
window 函数为每个 thread_id
获取最后一个 sender_id
:
UPDATE thread t
INNER JOIN (
SELECT DISTINCT thread_id,
FIRST_VALUE(sender_id) OVER (PARTITION BY thread_id ORDER BY id DESC) sender_id
FROM message
) m ON m.thread_id = t.id
SET t.status = 'open'
WHERE m.sender_id <> 1;
参见demo。