У меня есть таблица со структурой
CREATE TABLE 'old_reminder' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'applicant_id' int(11) NOT NULL,
'date' datetime NOT NULL,
'type' enum('payment_15_min','payment_1_day','payment_3_day') NOT NULL DEFAULT 'payment_15_min',
PRIMARY KEY ('id')
)
и я хочу перенести свои данные в другую таблицу со структурой
CREATE TABLE 'new_reminders' (
'id' int(10) unsigned NOT NULL AUTO_INCREMENT,
'user_id' int(11) DEFAULT NULL,
'payment_reminder_1_count' int(11) DEFAULT NULL,
'payment_reminder_1_date' datetime DEFAULT NULL,
PRIMARY KEY ('id')
)
в основном несколько строк для каждого user_id
будут преобразованы в 1 строку со всеми значениями перечисления в виде столбцов. Я пробовал следующее, но он обновляет только 1 строку
UPDATE reminders
INNER JOIN old_reminder AS 'old'
ON user_id = old.applicant_id
SET new_reminder_1_date = IF(old.type = 'payment_15_min' OR old.type = 'payment_1_day' OR old.type = 'payment_3_day', old.date, '2018-01-01 00:00:00'),
payment_reminder_1_count = IF(old.type = 'payment_15_min' OR old.type = 'payment_1_day' OR old.type = 'payment_3_day',
CASE
WHEN old.type = 'payment_15_min' THEN 1
WHEN old.type = 'payment_1_day' THEN payment_reminder_1_count + 1
WHEN old.type = 'payment_3_day' THEN payment_reminder_1_count + 1 END, 0)
WHERE applicant_id = 123;
Если модель выглядит так
truncate table old_reminder;
insert into old_reminder (applicant_id,date,type) values (123,'2018-01-01','payment_15_min');
insert into old_reminder (applicant_id,date,type) values (123,'2018-01-02','payment_1_day');
truncate table new_reminders;
insert into new_reminders(user_id,payment_reminder_1_date) values (123,'2016-01-01');
Затем упрощенная версия вашего запроса
update new_reminders n join (select * from old_reminder order by applicant_id,'date') old on old.applicant_id = n.user_id
SET
enumstr = old.type,
payment_reminder_1_date =
case
when old.type in ('payment_15_min','payment_1_day','payment_3_day') then old.date
else '2017-01-01'
end
WHERE applicant_id = 123;
Производит этот результат, который, я думаю, означает то, что вы подразумеваете под ним, обновляет только 1 строку
+----+---------+--------------------------+-------------------------+----------------+
| id | user_id | payment_reminder_1_count | payment_reminder_1_date | enumstr |
+----+---------+--------------------------+-------------------------+----------------+
| 1 | 123 | NULL | 2018-01-01 00:00:00 | payment_15_min |
+----+---------+--------------------------+-------------------------+----------------+
1 row in set (0.00 sec)
Предложение where вычисляется последним в этом запросе и может свободно выбирать, какой из них требуется из набора результатов - в этом случае всегда первое.
если запрос изменен для тестового теста payment_reminder_1_date
update new_reminders n join (select * from old_reminder order by applicant_id,'date') old on old.applicant_id = n.user_id
SET
enumstr = old.type,
payment_reminder_1_date =
case
when old.type in ('payment_15_min','payment_1_day','payment_3_day') then old.date
else '2017-01-01'
end
WHERE applicant_id = 123 and n.payment_reminder_1_date <> old.'date'
Тогда вы получите нечто большее, чем вы надеетесь
+----+---------+--------------------------+-------------------------+---------------+
| id | user_id | payment_reminder_1_count | payment_reminder_1_date | enumstr |
+----+---------+--------------------------+-------------------------+---------------+
| 1 | 123 | NULL | 2018-01-02 00:00:00 | payment_1_day |
+----+---------+--------------------------+-------------------------+---------------+
1 row in set (0.00 sec)
Но я не думаю, что это на самом деле то, что вы ищете, и я бы предложил, чтобы курсор мог двигаться вперед.