Решение для взлома только в MySQL использует GROUP_CONCAT
в сочетании с вложенными функциями SUBSTRING_INDEX
, чтобы получить первый элемент в строке с упорядоченными запятыми.
Это не идеальный подход ; но это уменьшит количество необходимых подзапросов и может быть эффективным для вашего особого случая.
Вам также нужно будет использовать SET SESSION group_concat_max_len = @@max_allowed_packet;
.
Мы в основном определяем продажи и количество случаев для комбинации продукта и категории. Этот набор результатов затем используется как Производная таблица , и мы используем хак Group_concat()
для определения продукта с максимальным количеством в категории.
SET SESSION group_concat_max_len = @@max_allowed_packet;
SELECT
dt.category,
SUM(dt.sale_per_category_product) AS total_sales,
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(dt.product ORDER BY dt.product_count_per_category DESC)
, ','
, 1
)
, ','
, -1
) AS top_product
FROM
(
SELECT
category,
product,
SUM(sale) AS sale_per_category_product,
COUNT(*) AS product_count_per_category
FROM demo
GROUP BY category, product
) AS dt
GROUP BY dt.category
Схема (MySQL v5.7)
| category | total_sales | top_product |
| -------- | ----------- | ------------|
| C1 | 27 | P1 |
| C2 | 44 | P2 |
| C3 | 44 | P1 |
Просмотр на БД Fiddle