#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 . . . Это довольно расплывчатый комментарий.