如何使用子查询来更新SELECT相对于父表的列?

时间:2016-06-08 05:13:57

标签: mysql sql

因此,我无法绕过此MySQL限制而无需更改整个查询或将其拆分为单独的SELECT / UPDATE操作对:

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

1 个答案:

答案 0 :(得分:0)

您可以尝试在外部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

如果没有查看数据并对查询有更深入的了解,我无法确定这是否符合您的要求。