2013-01-03 40 views
5

Điều tôi muốn làm là đặt từng bệnh nhân mã bệnh nhân duy nhất của nó bắt đầu bằng 1 và không dựa trên id hàng. Id chỉ xác định thứ tự. Một cái gì đó như thế này:Giá trị cập nhật MySQL từ cùng một bảng với số

patient_id patient_code 
    2   1 
    3   2 
    4   3 

Đây là câu hỏi của tôi:

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

Nhưng nó được ném lỗi:

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

tôi thấy chủ đề này: Mysql error 1093 - Can't specify target table for update in FROM clause.
Nhưng tôi không biết cách áp dụng câu trả lời được phê duyệt để làm việc với truy vấn phụ WHERE cần thiết cho COUNT.

Trả lời

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

Tính năng này đang hoạt động. Cảm ơn. Giải pháp của tôi nhanh hơn, nhưng cũng có một số hạn chế –

3

tôi tìm thấy giải pháp làm việc, nhưng điều này chỉ là cách giải quyết:

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

Bạn có thể muốn thêm 'ORDER BY patient_id' (MySQL cho phép ORDER BY trong một UPDATE mà không cần tham gia). –

+0

Có, tôi biết, thx anyway. –

1

Hãy thử điều này,

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

Các vấn đề liên quan