У меня возникли проблемы с уменьшением избыточности запроса в MySQL. В настоящее время у меня это работает, но мне кажется, что у меня слишком много накладных расходов, потому что он использует избыточный подзапрос. То, что я пытаюсь сделать, это использовать базу данных аренды DVD, чтобы узнать, какой магазин место арендовала более DVD, за каждый месяц в 2005 годуМинимизация избыточности MySQL-запроса
Вот это рабочий запрос,
SELECT b.month, c.store_id, b.maxRentals
FROM
(SELECT a.month, MAX(a.rentalCount) as maxRentals
FROM
(SELECT MONTH(rental.rental_date) as month, inventory.store_id, count(1) as rentalCount
FROM rental
INNER JOIN inventory
ON rental.inventory_id = inventory.inventory_id
WHERE YEAR(rental.rental_date) = 2005
GROUP BY MONTH(rental.rental_date), inventory.store_id
) a
GROUP BY a.month
) b
INNER JOIN
(SELECT MONTH(rental.rental_date) as month, inventory.store_id, count(1) as rentalCount
FROM rental
INNER JOIN inventory
ON rental.inventory_id = inventory.inventory_id
WHERE YEAR(rental.rental_date) = 2005
GROUP BY MONTH(rental.rental_date), inventory.store_id
) c
ON b.maxRentals = c.rentalCount
GROUP BY b.month;
Обратите внимание, как подзапрос с псевдоним «c» - это тот же подзапрос псевдонима «a». Я не уверен, есть ли способ избавиться от этого, так как я не могу присоединиться к псевдониму. Я просто застрял в гигантском запросе, или есть что-то еще, что я могу сделать?
MySQL 8 (в настоящее время в бета-версии) реализует Common Table Expressions, поэтому вы сможете сделать это в будущем с меньшим избыточным объемом. Или вы можете переключиться на PostgreSQL или любую другую базу данных SQL. –
Как насчет 'CREATE TEMPORARY TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ ИСПОЛЬЗОВАТЬ AS (SELECT [subquery SQL здесь])', затем присоединяться к 'invent' (и падать в конце)? – Eugene
Теперь, глядя на ваш код, я думаю, что его можно переписать с помощью 'CASE' ... позвольте мне пойти ... – Eugene