SQL: обновить значение на основе следующих строк данных - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть таблица customer_service_types в phpmyadmin с этими полями:

id (int) | customer_id (int) | service_type_int (int) | price (decimal) | created (datetime) | card (tinyint)

Вот некоторые записи:

rows

Приложение, когда пользователь добавляет новую услугу для клиента с пользовательской датой создания, создает другую службу с идентификатором 3 (оплата) с сегодняшней датой.Я хочу обновить все платежи с указанием даты следующих услуг.

Итак, я хочу обновить поле платежей created, указав created значения , следующего за * 1018.* услуги для конкретного клиента.Так, например, мне нужно обновить created из id: 168 значением created для того же customer_id, но только для следующей строки, если оно имеет service_type_id! = 3.

Пробовал до сих пор:

UPDATE customer_service_types cst
    SET cst.created = (SELECT created
                FROM customer_service_types cst2
                WHERE cst.id = (cst2.id - 1) AND cst2.service_type_id <> 3
               ) 
    WHERE cst.service_type_id = 3;

Но я получаю эту ошибку:

Невозможно указать целевую таблицу 'cst' для обновления в предложении FROM

И я не знаю, даст ли этот запрос желаемый результат

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вместо этого вы можете перенести свой подзапрос в форму Производная таблица . Попробуйте следующее:

UPDATE customer_service_types AS cst 
JOIN 
(
  SELECT id, created
  FROM customer_service_types
  WHERE service_type_id <> 3
) AS cst2 
  ON cst.id = (cst2.id - 1)

SET cst.created = cst2.created 
WHERE cst.service_type_id = 3;
0 голосов
/ 14 ноября 2018

Вы можете использовать join:

UPDATE customer_service_types cst JOIN
       customer_service_types cstnext
       ON cstnext.id = cst.id and cstnext.service_type_id <> 3
    SET cst.created = cstnext.created
    WHERE cst.service_type_id = 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...