代码之家  ›  专栏  ›  技术社区  ›  supermitch

如何用增量值更新一组记录

  •  1
  • supermitch  · 技术社区  · 15 年前

    我有一张表,列有“step_id”、“goal_id”和“step_number”。

    步骤ID将是主要的自动递增键
    目标将各个步骤分组为特定的目标
    步骤号当前在所有地方都是0,新创建的

    我想更新表格,以便将步骤编号设置为0、1、2、3等,对于按步骤编号排序的每一组类似的“目标编号”。

    用另一种方式说,我想按照步骤“i d”的升序,将给定目标的步骤从0数到有多少目标。

    我尝试了显而易见的:

    $query=“update steps set step_num=step_num+1,其中goal_id='689'order by step_id”;

    但这只是将所有行设置为1(如预期的那样)。

    我还尝试使用各种子查询,但我得到一个错误,说我无法更新FROM子句中使用的表。

    思想?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Thomas    15 年前
    Update steps
    Set step_num =  (
                        Select Count(*)
                        From steps As T1
                        Where T1.goal_ID = steps.goal_ID
                            And T1.step_ID < steps.step_ID
                        )
    

    编辑

    看起来您在MySQL中遇到了一个关于更新包含相关子查询的查询的错误。以上为标准化版本。你可以在MySQL中绕过这些限制,比如:

    Update steps
    Set step_num =  (
                        Select Count(*)
                        From    (
                                Select T1.step_Id, T1.goal_Id
                                From steps As T1
                                ) As Z
                        Where Z.goal_Id = steps.goal_ID
                            And Z.step_ID < steps.step_ID
                        )
    

    另一个解决方案:

    Update steps As T1
        Join    (
                Select T1.step_ID, Count(T2.step_ID) As step_num
                From steps As T1
                    Left Join steps As T2
                        On T2.goal_ID = T1.goal_ID
                            And T2.step_ID < T1.step_ID
                Group By T1.step_ID
                ) As T3
            On T3.step_ID = T1.step_ID
    Set step_num = T2.step_num
    
        2
  •  2
  •   ajreal    15 年前

    尝试将查询拆分为2,并利用 mysql user defined variables

    喜欢

    $db->query("SET @counter:=-1");
    $db->query(UPDATE steps SET step_num = @counter:=@counter+1 WHERE goal_ID='689' ORDER BY step_ID");