我在嘗試減少MySQL查詢冗餘時遇到了一些麻煩。我目前有它的工作,但它感覺像我有太多的開銷,因爲它使用冗餘子查詢。我所試圖做的是使用DVD租賃數據庫找到其店鋪位置在2005年儘量減少MySQL查詢的冗餘度
這裏已經租出去了更多的DVD每個月爲工作查詢
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(目前處於測試階段)將實現通用表格表達式,因此您將能夠在未來以較少的冗餘執行此操作。或者你可以切換到PostgreSQL或任何其他SQL數據庫。 –
'CREATE TEMPORARY TABLE IF NOT EXISTS如何發明AS(SELECT [subquery SQL here])',然後加入到'invent'(並在結尾放置)? – Eugene
現在看你的代碼,我認爲它可以使用'CASE'重寫...讓我有一個去... – Eugene