Есть две таблицы: список фильмов, список актёров в фильмах с гонорарами за участие. Необходимо составить запрос, который вернет названия фильмов в порядке участия в них самых зарабатывающих актеров, от большего к меньшему. Т.е. запрос должен посчитать для каждого фильма сумму гонораров актеров за участие в данном фильме и во всех остальных фильмах, и отсортировать фильмы по данному параметру. CREATE TABLE films ( id SERIAL PRIMARY KEY, name VARCHAR(256) NOT NULL ); CREATE TABLE film_actors ( film_id INT, actor_id INT, fee INT, UNIQUE (film_id, actor_id), INDEX (actor_id) ); INSERT INTO films (id, name) VALUES (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'); INSERT INTO film_actors (film_id, actor_id, fee) VALUES (1, 1, 1000), (1, 2, 500), (1, 3, 3000), (2, 1, 500), (2, 4, 1000), (2, 5, 600), (3, 6, 1000), (3, 3, 100), (3, 7, 1000), (4, 5, 1100), (4, 7, 1200), (4, 3, 900); Так вот проблема у меня не в том чтобы составить сам запрос, а в алгоритме решения этой задачи. Я пытался сгруппировать по actor_id и через sum(fee) нашел самых зарабатываемых актеров, отсортировал их по sum(fee) в обратном порядке. А вот как теперь увязать это с id фильмов никак не пойму.
Если без вложенных запросов, то создайте дополнительные таблицы, или представления с необходимыми выборками. Всё объедините, и сортируйте как вам надо.
За один запрос сделать это вполне реально, но нужно ли... Такого рода выборки отнимают много ресурсов и времени. То есть их нужно кэшировать, записывая в отдельную таблицу. Периодически обновляя. Иначе пользоваться этим будет весьма непросто.
Такое вот задание у меня, сделать именно так. Сам я вообще работаю с eloquent laravel и запросы давно не составляю.
Так он про это и пишет, дескать понимает, что нужно объединить с чем-то, а как не понимает. Любая выборка это готовая таблица. Остается только дать ей имя и объединить со "статичной" таблицей используя ON или USING --- Добавлено --- Да.
Нда.. до чего дожили с orm Страшно представить спецов которые потом вопросы совсем не смогут составлять
SELECT actor_id, SUM(fee) as fee FROM `film_actors` GROUP BY actor_id ORDER BY fee DESC film.id теряется и как мне тогда соединить две таблицы?
имхо - постановка задачи не совсем корректная ... что за порядок участия? Например у вас будет 1. Шварцнейгер, 2. Сталлоне , по заработку и каждый в 3 фильмах будет участвовать, причем в некоторых вместе, как тогда результат то должен выглядеть?
Как я понял задание, надо сперва определить порядок актеров по их доходу, а потом отсортировать фильмы в порядке участия актеров, которые больше всего заработали. Ответ должен быть такой Для этих данных запрос выборки должен вернуть фильмы в следующем порядке: D, C, A, B
Я все равно не понимаю смысла фразы "в порядке участия актеров" - как этот порядок определен? Вот 3 актер, самый высокооплачиваемый, но он в нескольких фильмах снимался! Как вы определяте что нужно D?
Мне дали задачу с таким условием и дали правильный ответ к ней. Вот и я сижу и думаю как же ее решить. Я так понял, надо отсортировать фильмы в порядке актеров, т.е взять самых высокооплачиваемых, а это актеры 3, 7 и 5 они все снимались в фильме D, значит этот фильм первый в списке и так далее
Мне не надо составлять сам запрос на sql. Я не могу понять как вообще решается такая задача. Надо сперва сортировать вторую таблицу или же начать запрос с выбора первой по id, или еще как-нибудь?
Вот таким запросом SELECT actor_id, SUM(fee) as fee FROM `film_actors` GROUP BY actor_id ORDER BY fee DESC
Потому, что в ваших таблицах столбцы с ID фильма имеют разные имена. Используйте оператор ON для указания этих столбцов.
Ваши советы пусты. При том запросе, который я вам написал выше, остается только два столбца actor_id и fee, как бы я не использовал join в результате будет все та же таблица с двумя столбцами. Если ваши советы "знаю ли я, что такое join" или "используйте on", лучше вообще ничего не пишите.