2013-01-03 13 views
5

Quello che voglio fare è impostare ogni paziente sul suo codice paziente univoco che inizia con 1 e non è basato su id riga. L'ID specifica solo l'ordine. Qualcosa di simile a questo:Valore aggiornamento MySQL dalla stessa tabella con conteggio

patient_id patient_code 
    2   1 
    3   2 
    4   3 

Questa è la mia domanda:

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

Ma sta gettando errore:

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

ho trovato questa discussione: Mysql error 1093 - Can't specify target table for update in FROM clause.
Ma non so come applicare la risposta approvata per lavorare con la sottoquery WHERE che è necessaria per COUNT.

risposta

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

Funziona. Grazie. La mia soluzione è più veloce, ma ha anche alcune limitazioni –

3

ho trovato la soluzione di lavoro, ma questo è solo soluzione alternativa:

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

Si consiglia di aggiungere 'ORDER BY patient_id' (MySQL consente ORDER BY in un UPDATE senza join). –

+0

Sì, lo so, comunque. –

1

Prova questa,

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

Problemi correlati