8

我想要做的是为每位患者设置其唯一的患者代码,该代码以 1 开头,并且不基于行 ID。Id 仅指定顺序。像这样的东西:

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 子句
但我不知道如何应用批准的答案来处理 COUNT 所必需的子查询 WHERE。

4

4 回答 4

10
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 ;
于 2013-01-03T12:36:22.697 回答
3

我找到了可行的解决方案,但这只是解决方法:

SET @code=0;
UPDATE patients SET patient_code = (SELECT @code:=@code+1 AS code)
于 2013-01-03T12:30:59.313 回答
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

于 2013-01-03T12:36:03.390 回答
0

感谢Mari 的回答,我找到了解决类似问题的方法。但我想补充一点解释,起初他的回答对我来说并不太清楚。

我想做的很简单,如下所示:

UPDATE my_comments AS c 
SET c.comment_responses = (
   SELECT COUNT(c1.*) FROM my_comments AS c1
   WHERE c.uid = c.parent_uid
);

感谢Mari,我找到了如何在不遇到错误的情况下实现这一目标的解决方案You can't specify target table 'p1' for update in FROM clause

UPDATE my_comments AS c
INNER JOIN (
    SELECT c1.parent_uid, COUNT(*) AS cnt
        FROM my_comments AS c1
        WHERE c1.parent_uid <> 0
        GROUP BY c1.parent_uid
) AS c2
SET c.comment_responses = c2.cnt
WHERE c2.parent_uid = c.uid;

在获得此解决方案之前,我的问题是 2:

  1. parent_uid字段并不总是包含父级的 id,这就是我WHERE在内部连接中添加语句的原因
  2. GROUP BY在我自己执行语句之前,我不太明白为什么我需要SELECT它,答案是:因为COUNT对结果进行分组并真正计算所有内容。为了防止这种行为,GROUP BY需要。就我而言,我不必将其分组,uidparent_uid可以得到正确的计数。如果我将其分组,uidCOUNT始终为 1,但parent_uid结果中存在多次。我建议您SELECT在执行完整语句之前自行检查语句以检查它是否是您期望的结果UPDATE
于 2021-11-11T10:00:45.660 回答