• Toon Claes's avatar
    Add workaround for UPDATE with subquery when using MySQL · a488fc0a
    Toon Claes authored
    When trying to run an UPDATE, this query is ran:
    
    ```sql
    UPDATE `todos`
    INNER JOIN `projects` ON `projects`.`id` = `todos`.`project_id`
    SET `todos`.`state` = 'done'
    WHERE `todos`.`user_id` = 4
      AND (`todos`.`state` IN ('pending'))
      AND (EXISTS
             (SELECT 1
              FROM `project_authorizations`
              WHERE `project_authorizations`.`user_id` = 4
                AND (project_authorizations.project_id = projects.id))
           OR projects.visibility_level IN (10,
                                            20))
      AND `projects`.`id` IN
        (SELECT `todos`.`project_id`
         FROM `todos`
         WHERE `todos`.`user_id` = 4
           AND (`todos`.`state` IN ('pending')))
      AND (`todos`.`state` != 'done')
    ```
    
    But MySQL does not like the subquery used to filter on
    `projects.id IN (SELECT ...`
    
    Because the subquery queries from the same table:
    
    > Error: You can’t specify target table ‘todos’ for update in FROM clause
    
    So as workaround, wrap it in another subquery, where the original
    subquery is aliased using the `AS` statement.
    
    Mostly inspired by https://stackoverflow.com/a/43610081/89376
    a488fc0a
todos_finder.rb 3.11 KB