Выбрать данные, посчитать строки и сделать update одним запросом - MySQL
Формулировка задачи:
Здравствуйте, есть таблица films(родительская)
и stills(дочерняя)
Можно ли придумать запрос который установит films.availableForGame в TRUE если количество кадров для данного фильма имеющих still.availableForGame=TRUE больше или равно 2.
Ответившему плюс к карме, и долгих лет.
CREATE TABLE `films` ( `film_id` BIGINT(20) NOT NULL, `availableForGame` tinyint(4) DEFAULT NULL, `name` VARCHAR(255) DEFAULT NULL PRIMARY KEY (`film_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `stills` ( `still_id` BIGINT(20) NOT NULL, `film_film_id` BIGINT(20) DEFAULT NULL, `availableForGame` bit(1) NOT NULL, PRIMARY KEY (`still_id`), KEY `FK_dvcb1uaqjeir126hhp5kkj4qg` (`film_film_id`), CONSTRAINT `FK_dvcb1uaqjeir126hhp5kkj4qg` FOREIGN KEY (`film_film_id`) REFERENCES `films` (`film_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Решение задачи: «Выбрать данные, посчитать строки и сделать update одним запросом»
textual
Листинг программы
UPDATE films f SET f.availableForGame = 1 WHERE 2 >= (SELECT COUNT(1) FROM stills s WHERE s.film_film_id = f.film_id AND f.availableForGame=1);
Объяснение кода листинга программы
В данном коде выполняется обновление столбца availableForGame в таблице films.
Условие обновления определяется с помощью подзапроса, который выбирает количество строк из таблицы stills, где film_id совпадает с film_id из таблицы films и availableForGame равно 1.
Если это количество больше или равно 2, то значение столбца availableForGame в таблице films устанавливается равным 1.
- Обновление столбца
availableForGameв таблицеfilms - Условие обновления определяется с помощью подзапроса
- Подзапрос выбирает количество строк из таблицы
stills - Условие:
film_idиз таблицыfilmsравенfilm_idиз таблицыstills - И
availableForGameравно 1 - Если количество строк больше или равно 2, то значение столбца
availableForGameустанавливается равным 1