2010-11-21 48 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