【问题标题】:How to UPDATE using subquery that SELECT's column relative to the parent table?如何使用 SELECT 列相对于父表的子查询进行更新?
【发布时间】:2016-06-08 05:13:56
【问题描述】:

所以,如果不更改整个查询或将其拆分为单独的 SELECT/UPDATE 操作对,我似乎无法绕过这个 MySQL 限制:

UPDATE `animal`
LEFT JOIN `animalFriends`
    ON (`animalFriends`.`animal_id_friend`=`animal`.`id`)
SET `animal`.`trainer_friend_name_latest`=
(
    SELECT `trainer`.`name`
    FROM `animalFitnessGroup`
    LEFT JOIN `trainer`
    ON (`animalFitnessGroup`.`trainer_id`=`trainer`.`id`)
    WHERE `animalFitnessGroup`.`animal_id_firstMember`=`animal`.`id` OR
   `animalFitnessGroup`.`animal_id_firstMember`=`animalFriends`.`animal_id_friend2`
    ORDER BY `animalFitnessGroup`.`id` DESC
    LIMIT 1
)
WHERE `animal`.`id`=123

这种查询会呈现错误:

您不能在 FROM 子句中指定目标表“动物”进行更新

虽然我确信这样做是有充分理由的,但由于查询的意图很明确,这有点令人沮丧。有简单的解决方法吗? UPDATE FROM 可以成为一个解决方案...而不将其重写为子查询 SELECT 操作或两个单独的操作? https://stackoverflow.com/a/37284940/963901

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以尝试在外部 UPDATE 语句中将所有四个表显式连接在一起:

    UPDATE `animal`
    LEFT JOIN `animalFriends`
        ON (`animalFriends`.`animal_id_friend`=`animal`.`id`)
    LEFT JOIN `animalFitnessGroup`
        ON `animalFitnessGroup`.`animal_id_firstMember`=`animal`.`id` OR
           `animalFitnessGroup`.`animal_id_firstMember`=`animalFriends`.`animal_id_friend2`
    LEFT JOIN `trainer`
        ON `animalFitnessGroup`.`trainer_id`=`trainer`.`id`
    SET `animal`.`trainer_friend_name_latest` = `trainer`.`name`
    WHERE `animal`.`id`=123
    

    在没有查看数据并对查询有更深入了解的情况下,我无法确定这是否会如您所愿。

    【讨论】:

    • animalFitnessGroup 表中有很多对象,我们只是尝试选择最新的一个。所以,我不确定 JOIN 是否会起作用,因为它需要排序?
    • 您能否在问题中包含示例数据?仅使用您的尝试很难可视化您的查询。
    • 好吧,问题在于数据较少,更多的是SELECT-ing 和UPDATE-ing 同一张表的限制。
    • @BenGuild 如果您透露一些示例数据和逻辑,可能还有另一种策略可以避免这种情况。这就是我要求它的原因。
    • 总是这样,我完全理解。但在这种情况下,我正在寻求特定查询的帮助......本质上是根据引用正在更新的表的子查询来更新列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多