За последние 24 часа нас посетили 8711 программистов и 457 роботов. Сейчас ищут 119 программистов ...

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

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

  1. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    Да бред какой-то, а если актеры 3 и 7 снимались в С ? То что?
    А если они все трое и ещё один снимались в Г???
    Где четкое определение как сортировать фильмы?
    Нет
    Не то где максимальное количество самых высокооплачиваемых, не то по совокупности веса этих актеров...

    Понятно что задание тестовое, но возможно в том и тест чтоб не путаться с недостаточными даными решать задачу
     
  2. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Я думал, что я настолько дурак, а тут оказывается и на специализированном форуме решить задачу не могут.
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    Вопрос не в решении - а в постановке задачи. Вы адекватно сформулируйте - что значит отсортировать в порядке актеров, с учетом того что в каждом фильме множество актеров и они могут повторятся.
     
  4. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Я не сам придумал. А скопировал постановку задачи из задания. К том же, если уж я понял задание, то в постановке задачи все очень просто. Даже ответ мне специально написали, что бы не запутаться. Отсортировать фильмы в порядке участия в них самых высокооплачиваемых актеров, что не понятно здесь? В ответе первым идем фильм D, потому как в нем снимались актеры 3, 7 и 5, они же являются самыми высокооплачиваемыми, и так далее.
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    допустим есть фильм Г - где снимались артисты 3, 7 которые тоже самые высокооплачиваемые, но их меньше - где этот фильм будет?
    Или есть фильм П - где снимались 3, 7, 5 и например еще один артист из четверки самых высокооплачиваемых - его куда ставить в вашем ранге.

    Я не говорил что вы сами придумали - понимаю что задание готовое. А адекватного объяснения - что такое порядок участия в фильме - нет.
     
  6. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Я понял ваш вопрос. Сортировка фильмов должна быть по количеству общей зарплаты актеров, которые снимались в этом фильме.
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    Опять же не совсем точно.... в одном фильме например снимались 2 топовых артиста с общей зарплатой в 1000, в другом 10 нетоповых но с общей зарплатой в 1500....

    Если то что вы пишете надо, зачем веcь сыр-бор по определению топовых артистов? Взять фильмы сджойнить суммы за фильм и так отсортировать, не?


    Код (Text):
    1. SELECT films.*, SUM(film_actors.fee) AS summ FROM films
    2. LEFT JOIN film_actors ON films.id = film_actors.film_id
    3. GROUP BY films.id ORDER BY summ ASC
     
  8. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Нет. из второй таблицы видно, что в каждом фильме снималось по три актера, не больше. Но больше всего заработали актеры 3, 7 и 5 за все фильмы где они снимались. Они же все трое снимались в фильме D, соответственно этот фильм на первом месте, что совпадает с ответом, который дан к заданию
     
  9. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    Ну.... Мало ли что сейчас видно. Делать решение под конкретный ограниченный набор данных - минимум некошерно, максимум нерабочее решение.

    С такой формулировкой задачи - нафиг..
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.321
    Симпатии:
    1.033
    Адрес:
    там-сям
    https://www.db-fiddle.com/f/dND57fvKJFMyPSuufje7ki/0
    Код (SQL):
    1. SELECT films.*, SUM(x.sum_fee) AS sum_fee
    2. FROM films
    3. JOIN film_actors ON film_actors.film_id = films.id
    4. JOIN (
    5.    SELECT actor_id, SUM(fee) AS sum_fee
    6.    FROM film_actors
    7.    GROUP BY actor_id
    8. ) AS x ON x.actor_id = film_actors.actor_id
    9. GROUP BY films.id
    10. ORDER BY sum_fee DESC
    --- Добавлено ---

    или без подзапроса https://www.db-fiddle.com/f/dND57fvKJFMyPSuufje7ki/1
    Код (SQL):
    1. SELECT films.*, SUM(film_actors.fee) AS sum_fee
    2. FROM films
    3. JOIN film_actors ON film_actors.film_id = films.id
    4. GROUP BY films.id
    5. ORDER BY sum_fee DESC
    --- Добавлено ---
    разница в том, что первый считает сумму гонораров актеров по всем фильмам где они участвовали
    второй считает сумму гонораров по конкретному фильму.
    --- Добавлено ---
    есть замечание по возможности группировки с "*" во фразе select: в MySQL есть разные уровни строгости соответствия стандарту SQL.
    важно понимать, что все поля в выдаче должны функционально зависеть от группируемого(ых) поля(ей)!

    см. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
     
    Bit99 нравится это.
  11. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Спасибо. А что такое x.sum_fee?
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    @artoodetoo - все здорово, но каков смысл данного запроса выраженный человеческим языком?

    Список фильмов, отсортированный по суммарному заработку (во всех фильмах) всех участвующих актеров в данном фильме?
     
  13. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Это вроде переменной, куда потом подставляется это выражение? AS x ON x.actor_id = film_actors.actor_id
     
  14. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    Зачем писать то - о чем я не спрашивал?
     
  15. Bit99

    Bit99 Новичок

    С нами с:
    14 окт 2020
    Сообщения:
    51
    Симпатии:
    3
    Ошибся, показалось это модератор на вопрос ответил
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.321
    Симпатии:
    1.033
    Адрес:
    там-сям
    @ADSoft если ты можешь читать по английски, просто прочти его. SQL создавался как ограниченное подмножество английского языка для операций с множествами.
    --- Добавлено ---
    В какой-то момемент перестаёшь относиться к нему как к шаманству и начинаешь просто думать категориями множеств. Это не объяснить в одном коментарии, надо нарабатывать навык.
    --- Добавлено ---
    "AS" это назначение псевдонима (алиас) таблице или подзапросу чтобы потом ссылаться на него. подзапрос используется точно также, как обычная таблица, но у подзапроса нет имени пока ты не назначишь ему имя через "AS".
     
  17. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.483
    Симпатии:
    473
    Адрес:
    Татарстан
    В том-то и дело, что могу, и формулировка запроса не совпадает с изначальной постановкой задачи.

    Отсюда вывод, что или формулировка кривая, либо решение не совпадает с задачей
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.321
    Симпатии:
    1.033
    Адрес:
    там-сям
    Как скажешь! :) Видимо потому неправильно, что там нет left join? :)