Для каждой страны найдите категорию продукта, которые были наиболее популярными — подзапросы

#mysql #sql

#mysql #sql

Вопрос:

Приведены таблицы:

 1) Categories: id, name
2) Countries: id, name
3) Producers: id, name, country_id
4) Products: id, name, price, category_id, producer_id
5) Customers: id, name, surname, age, country_id
6) Customer_orders: id, customer_id, product_id, quantity, discount, order_date
  

Я хочу найти категорию самого популярного продукта для каждой страны (категория самых популярных продуктов — продукты были произведены производителями из указанной страны)

Мой текущий apporach:

 select countries.name, categories.name, sum(cs.quantity) from countries
join producers on producers.country_id = countries.id
join products on products.producer_id = producers.id
join categories on categories.id = products.category_id
join customerorders as cs on cs.product_id = products.id
group by countries.name
  

На самом деле это не очень хорошее решение. Не уверен, как это сделать, я полагаю, я должен сгруппировать все продукты по странам, а затем для каждой страны подсчитать количество продуктов для каждой категории продукта (продукты, произведенные производителями из указанной страны) и, наконец, найти категорию с большинством купленных продуктов.

Комментарии:

1. Этот запрос недействителен. Какую версию MySQL вы используете? (Обычно вы ГРУППИРУЕТЕ ПО тем же столбцам, которые вы ВЫБИРАЕТЕ, за исключением тех, которые являются аргументами для set функций.)

2. Вот как вы должны обрабатывать ГРУППИРОВКУ ПО в MySQL @jarlh прав «Обычно вы ГРУППИРУЕТЕСЬ ПО тем же столбцам, что и ВЫБРАНЫ вами, за исключением тех, которые являются аргументами для установки функций». Но есть случаи, когда SELECT * FROM t GROUP BY id фактически может быть допустимым SQL из-за функциональной зависимости (SQL 1999 дополнительная функция)

Ответ №1:

Вам нужно исправить свои group by , а затем использовать оконные функции:

 select c.*
from (select co.name as country_name, c.name as category_name, sum(co.quantity) as total_qty,
             row_number() over (partition by co.name order by sum(co.quantity) desc) as seqnum
      from countries co join
           producers pr
           on pr.country_id = co.id join
           products p
           on p.producer_id = pr.id join
           categories c
           on c.id = p.category_id join
           customerorders co
           on co.product_id = p.id
      group by co.name, c.name
     ) c
where seqnum = 1;
  

Это должно работать в MySQL 8 . Это возможно выразить в более ранних версиях, но немного затруднительно.

Комментарии:

1. @Ares02 . . . Это довольно расплывчатый комментарий.