Получение ОШИБКИ 1093 (HY000) с использованием подзапроса - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть следующая таблица:

--------------------------------------------------------------------------------
| id | pack_id | user_id |     start_date      |       end_date      | runtime |
--------------------------------------------------------------------------------
| 1  |    52   |   9     | 2019-04-09 11:53:00 | 2019-04-09 11:54:00 |   60    |
| 2  |    52   |   9     | 2019-04-09 11:58:00 |         NULL        |   NULL  |

Я хотел бы обновить end_date и runtime последнего идентификатора тех же pack_id и user_id.end_date должны принять текущую дату и время.Вот мой запрос:

UPDATE 
    myTable 
SET 
    end_date = NOW(),
    runtime = TIMESTAMPDIFF(SECOND, start_date, NOW()) 
WHERE 
    id = (
        SELECT 
            max(id) 
        FROM 
            myTable 
        WHERE 
            user_id = '9' 
        AND 
            pack_id = '52'
    )

И я получаю следующую ошибку:

ОШИБКА 1093 (HY000) в строке 1: Вы не можете указать целевую таблицу 'myTable' дляобновление в предложении FROM

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Вы не можете сделать это в MySQL, поэтому используйте вместо него JOIN:

UPDATE myTable t JOIN
       (SELECT max(id) as max_id
        FROM myTable 
        WHERE user_id = '9' AND pack_id = '52'
       ) tt
       ON t.id = tt.max_id
    SET t.end_date = NOW(),
        t.runtime = TIMESTAMPDIFF(SECOND, t.start_date, NOW()) ;
0 голосов
/ 09 апреля 2019

Вам нужен подзапрос для создания временного набора значений и избегания использования одной и той же таблицы для обновления и выбора на том же уровне.Это можно сделать с помощью вложенного выбора, например:

UPDATE myTable 
SET  end_date = NOW(),
    runtime = TIMESTAMPDIFF(SECOND, start_date, NOW()) 
WHERE id = (
select  max_id from (
        SELECT 
            max(id)  max_id  
        FROM  myTable 
        WHERE  user_id = '9' 
        AND pack_id = '52'

        ) t   )

или внутреннего соединения в подзапросе

UPDATE myTable m 
INNER JOIN (
        SELECT 
            max(id)  max_id  
        FROM  myTable 
        WHERE  user_id = '9' 
        AND pack_id = '52'

        ) t   ON t.max_id  =  m.id 

SET  end_date = NOW(),
    runtime = TIMESTAMPDIFF(SECOND, start_date, NOW()) 
0 голосов
/ 09 апреля 2019

использовать подзапрос глубже в предложении from

UPDATE 
    myTable 
SET 
    end_date = NOW(),
    runtime = TIMESTAMPDIFF(SECOND, start_date, NOW()) 
WHERE 
    id = (
 select id from (
        SELECT 
            max(id) as id
        FROM 
            myTable 
        WHERE 
            user_id = '9' 
        AND 
            pack_id = '52'
) a
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...