编辑:现在就开始,解决这篇文章的底部。
我已经尝试创建此查询数小时,但没有成功:
UPDATE tasks
SET `Order`=
(
CASE WHEN
(
SELECT EXISTS
(
SELECT 1
FROM user_job_tasks ujt
WHERE ujt.JobID = :jobID AND ujt.TaskID = LAST_INSERT_ID()
)
)
THEN
(
SELECT `order` FROM
(
SELECT MAX(t.`Order`)+1 AS `Order`
FROM user_job_tasks ujt
LEFT OUTER JOIN tasks t ON ujt.TaskID = t.ID
WHERE ujt.JobID = :jobID
) AS temp
)
ELSE
(
1
)
END
)
WHERE ID = LAST_INSERT_ID()
现在,重点是更新 tasks
表格的列Order
,其中ID
等于某事(这里是LAST_INSERT_ID())。
如果 user_job_tasks
中存在jobID
和taskID
匹配值的任何记录,我想设置{{1在 Order
中找到Order
的最高值+1,其中user_job_tasks
与值匹配。
如果没有,jobID
将设置为1。
我只收到错误Order
。我在查询语法中找不到任何错误。
对于令人困惑的解释感到抱歉,或许我应该去睡觉。
工作解决方案:
General error: 1093 You can't specify target table 'tasks' for update in FROM clause
答案 0 :(得分:0)
我并非100%确定这会做你想要的,但我认为它确实如此:
UPDATE tasks
SET `Order`= coalesce((SELECT MAX(t.`Order`) + 1 AS `Order`
FROM user_job_tasks ujt JOIN
tasks t
ON ujt.TaskID = t.ID
WHERE ujt.JobID = :jobID
), 1)
WHERE ID = LAST_INSERT_ID();
这只是查找记录的最大ID(+ 1),如果不存在则使用1。
编辑:
MySQL不喜欢在from
子句中使用正在更新的表。所以使用第二个子查询正确地说明了上述内容:
UPDATE tasks
SET `Order`= coalesce((SELECT `Order`
FROM (SELECT MAX(t.`Order`) + 1 AS `Order`
FROM user_job_tasks ujt JOIN
tasks t
ON ujt.TaskID = t.ID
WHERE ujt.JobID = :jobID
)
), 1)
WHERE ID = LAST_INSERT_ID();
此限制也适用于您的查询。