2010-11-21 49 views
1

我有一个列“step_ID”,“goal_ID”和“step_number”的表。如何用增量值更新一组记录

step_id的数据类型将是主要的,自动递增的关键
goal_ID组的各个步骤为特定目标
STEP_NUMBER目前0无处不在,新创建

我想更新表,以便STEP_NUMBER设为0,1,2,3等等,每组有相似的“goal_ID”,由step_ID排序。

说了一种不同的方式,我想按照step_ID从小到大的顺序给出从0到目标有多少个给定目标的步数。

我尝试了很明显的:

$query = " UPDATE steps SET step_num = step_num + 1 WHERE goal_ID='689' ORDER BY step_ID";

但只是将所有的行1,(预期)

我想也利用各种子查询,但我得到一个错误说我不能” t更新FROM子句中使用的表。

想法?

回答

1
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 
+0

我仍然收到错误:“你不能在FROM子句中指定更新的目标表'步骤'”? – Symmitchry 2010-11-21 23:26:32

+0

@Symmitchry - 看起来你正在遇到MySQL中的一个bug。我已经发布了一个解决方法。 – Thomas 2010-11-22 02:43:43

2

尝试打破查询分成2,并利用mysql user defined variables

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

这奇妙的工作,谢谢你的提示。尽管我不知道如何扩展它来完成所有目标(即没有指定goal_ID),但我只是在FOR循环中重复这两个查询以实现所有可能的目标。一次性更新不够高雅,但又快又简单。 – Symmitchry 2010-11-21 23:47:29