2013-01-03 16 views
5

Co chcę zrobić, to ustawić dla każdego pacjenta jego unikalny kod pacjenta, który zaczyna się od 1 i nie jest oparty na identyfikatorze wiersza. Id określa tylko kolejność. Coś takiego:Wartość aktualizacji MySQL z tej samej tabeli z liczbą

patient_id patient_code 
    2   1 
    3   2 
    4   3 

To moje zapytanie:

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

Ale to jest rzucanie błąd:

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

Znalazłem ten wątek: Mysql error 1093 - Can't specify target table for update in FROM clause.
Ale nie wiem, jak zastosować zatwierdzoną odpowiedź, aby działała z podzapytaniem GDZIE jest to konieczne dla COUNT.

Odpowiedz

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

To działa. Dzięki. Moje rozwiązanie jest szybsze, ale ma również pewne ograniczenia –

3

znalazłem rozwiązanie działa, ale jest to tylko obejście:

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

Możesz dodać 'BY patient_id' (MySQL umożliwia ORDER BY w UPDATE bez sprzężeń). –

+0

Tak, wiem, mimo wszystko. –

1

Spróbuj tego,

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

Powiązane problemy