UPDATE + CASE WHEN + EXISTS + SELECT MAX的MySQL语法

时间:2014-06-11 03:38:26

标签: mysql sql sql-update case last-insert-id

编辑:现在就开始,解决这篇文章的底部。

我已经尝试创建此查询数小时,但没有成功:

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 中存在jobIDtaskID匹配值的任何记录,我想设置{{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

1 个答案:

答案 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();

此限制也适用于您的查询。