1

编辑:现在工作,这篇文章底部的解决方案。

我已经尝试创建这个查询几个小时了,但没有成功:

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如果在where中存在任何记录jobIDtaskID匹配值,我想设置为where中找到的Order最大值 + 1匹配值。Orderuser_job_tasksjobID

如果不是,Order将设置为 1。

我只是得到一个错误General error: 1093 You can't specify target table 'tasks' for update in FROM clause。我在查询语法中找不到任何错误。

抱歉解释混乱,也许我应该去睡觉。


工作解决方案:

UPDATE tasks
SET `Order`=
(
    COALESCE
    (
        (
            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
        ),
        1
    )
)
WHERE ID = LAST_INSERT_ID()
4

1 回答 1

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

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

于 2014-06-11T05:32:01.600 回答