2013-01-03 13 views
5

私がしたいことは、すべての患者に一意の患者コードを1から始まり、行IDに基づいていないように設定することです。 Idは順序を指定するだけです。このような何か:カウントが同じテーブルのMySQL更新値

patient_id patient_code 
    2   1 
    3   2 
    4   3 

これは私のクエリです:

UPDATE patients p1 
SET p1.patient_code = (
    SELECT COUNT(*) 
    FROM patients p2 
    WHERE p2.patient_id <= p1.patient_id 
) 

しかし、それはエラーを投げている:

#1093 - You can't specify target table 'p1' for update in FROM clause 

が、私はこのスレッドを見つけた: Mysql error 1093 - Can't specify target table for update in FROM clause
しかし、私はどのようにCOUNTに必要なサブクエリで動作するように承認された答えを適用するのか分かりません。

答えて

7
UPDATE 
    patients AS p 
    JOIN 
    (SELECT 
      p1.patient_id 
     , COUNT(*) AS cnt 
     FROM 
      patients AS p1 
     JOIN 
      patients AS p2 
      ON p2.patient_id <= p1.patient_id 
     GROUP BY 
      p1.patient_id 
    ) AS g 
    ON g.patient_id = p.patient_id 
SET 
    p.patient_code = g.cnt ; 
+0

これは動作しています。ありがとう。私のソリューションは高速ですが、いくつかの制限もあります –

3

私が働いて解決策を見つけたが、これは単なる回避策です:

SET @code=0; 
UPDATE patients SET patient_code = (SELECT @code:[email protected]+1 AS code) 
+1

、これを試してみてくださいあなたは(patient_id' BY 'ORDERを追加することもできますMySQLは結合なしでUPDATEでORDER BYを許可します)。 –

+0

はい、私は知っている、とにかくthx。 –

1

UPDATE patients p1 INNER JOIN 
(
    SELECT COUNT(*) as count,patient_id 
    FROM patients 
    group by patient_id 
)p2 
SET p1.patient_code=p2.count 
WHERE p2.patient_id <= p1.patient_id 

SQL_LIVE_DEMO

関連する問題