За последние 24 часа нас посетили 22044 программиста и 1116 роботов. Сейчас ищут 730 программистов ...

Выбрать записи из двух таблиц без вложенных запросов

Тема в разделе "MySQL", создана пользователем Bit99, 14 окт 2020.

  1. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Есть две таблицы: список фильмов, список актёров в фильмах с гонорарами за
    участие.
    Необходимо составить запрос, который вернет названия фильмов в порядке участия в них
    самых зарабатывающих актеров, от большего к меньшему. Т.е. запрос должен посчитать
    для каждого фильма сумму гонораров актеров за участие в данном фильме и во всех
    остальных фильмах, и отсортировать фильмы по данному параметру.

    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 фильмов никак не пойму.
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Если без вложенных запросов, то создайте дополнительные таблицы, или представления с необходимыми выборками.
    Всё объедините, и сортируйте как вам надо.
     
  3. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Сделать выборку надо за один запрос, как мне создать таблицу и сделать выбор сразу?
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    За один запрос сделать это вполне реально, но нужно ли...
    Такого рода выборки отнимают много ресурсов и времени. То есть их нужно кэшировать, записывая в отдельную таблицу.
    Периодически обновляя.
    Иначе пользоваться этим будет весьма непросто.
     
  5. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Такое вот задание у меня, сделать именно так. Сам я вообще работаю с eloquent laravel и запросы давно не составляю.
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Представьте выборку в виде таблицы, дав ей псевдоним, и объедините с остальными таблицами.
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    А left join разве не поможет?
     
  8. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    конечную выборку сделать as таблица и left join первая таблица?
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Так он про это и пишет, дескать понимает, что нужно объединить с чем-то, а как не понимает.
    Любая выборка это готовая таблица. Остается только дать ей имя и объединить со "статичной" таблицей используя ON или USING
    --- Добавлено ---
    Да.
     
    artoodetoo нравится это.
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Нда.. до чего дожили с orm
    Страшно представить спецов которые потом вопросы совсем не смогут составлять
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    На Либрусек лично залил два десятка книг SQL. Не читают походу.
     
  12. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    SELECT actor_id, SUM(fee) as fee FROM `film_actors` GROUP BY actor_id ORDER BY fee DESC
    film.id теряется и как мне тогда соединить две таблицы?
     
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    имхо - постановка задачи не совсем корректная
    ...
    что за порядок участия?

    Например у вас будет 1. Шварцнейгер, 2. Сталлоне , по заработку
    и каждый в 3 фильмах будет участвовать, причем в некоторых вместе,
    как тогда результат то должен выглядеть?
     
  14. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Как я понял задание, надо сперва определить порядок актеров по их доходу, а потом отсортировать фильмы в порядке участия актеров, которые больше всего заработали.

    Ответ должен быть такой
    Для этих данных запрос выборки должен вернуть фильмы в следующем порядке:
    D, C, A, B
     
  15. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Я все равно не понимаю смысла фразы "в порядке участия актеров" - как этот порядок определен?
    Вот 3 актер, самый высокооплачиваемый, но он в нескольких фильмах снимался! Как вы определяте что нужно D?
     
  16. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Мне дали задачу с таким условием и дали правильный ответ к ней. Вот и я сижу и думаю как же ее решить. Я так понял, надо отсортировать фильмы в порядке актеров, т.е взять самых высокооплачиваемых, а это актеры 3, 7 и 5 они все снимались в фильме D, значит этот фильм первый в списке и так далее
     
  17. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Так вам нужно готовое решение? Или разъяснение по ТЗ?
     
  18. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Мне не надо составлять сам запрос на sql. Я не могу понять как вообще решается такая задача. Надо сперва сортировать вторую таблицу или же начать запрос с выбора первой по id, или еще как-нибудь?
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Хорошо.
    Давайте по порядку.
    Как вы получаете сумму доходов от всех фильмов каждого актера?
     
  20. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Вот таким запросом
    SELECT actor_id, SUM(fee) as fee FROM `film_actors` GROUP BY actor_id ORDER BY fee DESC
     
  21. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Осталось объединить эту выборку с другой таблицей.
    Как пользоваться JOIN вы понимаете?
     
  22. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Join объединит две таблицы, вот только id соответствовать не будут
     
  23. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Потому, что в ваших таблицах столбцы с ID фильма имеют разные имена.
    Используйте оператор ON для указания этих столбцов.
     
  24. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    53
    Симпатии:
    4
    Ваши советы пусты. При том запросе, который я вам написал выше, остается только два столбца actor_id и fee, как бы я не использовал join в результате будет все та же таблица с двумя столбцами. Если ваши советы "знаю ли я, что такое join" или "используйте on", лучше вообще ничего не пишите.
     
  25. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    OK