2016-06-08 60 views
3

所以,我似乎無法避開這個MySQL限制在不改變整個查詢或將其拆分成一個獨立的SELECT/UPDATE操作對:如何更新使用子查詢SELECT列相對於父表?

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 

這類查詢的渲染錯誤:

You can't specify target table "animal" for update in FROM clause

儘管我確信這有一個很好的理由,但這有點令人沮喪,因爲查詢的意圖很明確。有一個簡單的解決方法嗎?難道UPDATE FROM是一個解決方案...沒有重寫這個子查詢SELECT操作或兩個單獨的操作? https://stackoverflow.com/a/37284940/963901

回答

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 

沒有看到數據,並具有查詢更深入的瞭解,我不能肯定,這將表現爲你想要的。

+0

'animalFitnessGroup'表中有許多對象,我們只是試圖選擇最新的一個。所以,我不確定JOIN是否會起作用,因爲它需要排序? –

+0

你能否在你的問題中包含樣本數據?僅使用您的嘗試來查看查詢是很困難的。 –

+0

那麼這個問題就是數據少了,而且更多的是'SELECT'和'UPDATE'在同一個表中有一個限制。 –