繁体   English   中英

UPDATE查询中的自引用MySQL表

[英]Self-referencing MySQL table in UPDATE-query

我有以下情况:

涉及3个表,“患者”,“用户”和“中心”。 它们具有以下属性和关系:

'患者':

  • pid =主键
  • doc =“用户”的“ uid”的外键
  • localid =默认设置为“ -1”

“用户”:

  • uid =主键
  • cid =“中心”的“ cid”的外键

'中央':

  • cid =主键

患者没有直接分配到中心。 而是将它们分配给特定用户,然后将其分配给一个中心。

当前,所有患者的患者“ localid”均设置为“ -1”。 我正在尝试提出一个SQL查询,该查询为所有患者增加“ localid”,但仅在中心范围内,它们通过用户间接关联。

本质上,我希望所有患者的中心都具有唯一的ID,但是每个中心的ID应该从0开始。

这是我尝试过的查询,我认为它与我的需求很接近:

UPDATE patient p1
SET p1.localid=(SELECT (max(p2.localid) +1)
                FROM patient p2
                WHERE (SELECT u1.cid
                       FROM users u1
                       WHERE u1.uid=p1.doc)=(SELECT u2.cid
                                             FROM users u2
                                             WHERE u2.uid=p2.doc));

这将导致sql错误“您无法在FROM子句中指定目标表'p1'用于更新”,因为'p1'在WHERE子句中进行了引用。

我可以通过使用多个SQL查询和PHP中的循环来轻松解决此问题,但我想知道是否可以仅使用普通SQL来解决此问题?

除了使用子查询,您还可以使用子查询中的条件将表本身JOIN ,并为其指定别名。 那应该允许您更新查询的同一张表。

就像是...

UPDATE patient p1
SET p1.localid = p2.newlocalid
INNER JOIN (
    SELECT pid, MAX(localid) + 1 AS newlocalid
    FROM patient p2
    WHERE...
) p2 ON p1.pid = p2.pid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM