2016-10-18 87 views
1

我在嘗試減少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」完全相同。我不確定是否有辦法擺脫這種情況,因爲我不能在別名上加入內聯。我只是堅持一個巨大的查詢,還是有什麼我可以做的?

+0

MySQL 8(目前處於測試階段)將實現通用表格表達式,因此您將能夠在未來以較少的冗餘執行此操作。或者你可以切換到PostgreSQL或任何其他SQL數據庫。 –

+0

'CREATE TEMPORARY TABLE IF NOT EXISTS如何發明AS(SELECT [subquery SQL here])',然後加入到'invent'(並在結尾放置)? – Eugene

+0

現在看你的代碼,我認爲它可以使用'CASE'重寫...讓我有一個去... – Eugene

回答

1

我90%肯定這個查詢將實現你的意圖:

SELECT MONTH(r.rental_date), i.store_id, COUNT(*) 
FROM rental r 
LEFT JOIN inventory i ON r.inventory_id = i.inventory_id 
WHERE YEAR(r.rental_date) = 2005 
GROUP BY MONTH(r.rental_date), i.store_id 

讓我知道如何去!

編輯:回答其存儲位置在2005已經租出去了更多的DVD每個月的問題

SELECT x.rental_month, x.store_id, MAX(x.rental_count) FROM (
SELECT MONTH(r.rental_date) AS rental_month, i.store_id AS store_id, COUNT(*) AS rental_count 
FROM rental r LEFT JOIN inventory i ON r.inventory_id = i.inventory_id 
WHERE YEAR(r.rental_date) = 2005 
GROUP BY MONTH(r.rental_date), i.store_id) x 
GROUP BY x.rental_month, x.store_id 

我是通過使用別名到處明確,你很可能省略一些。希望這有助於...

編輯:骯髒的黑客:

SELECT x.rental_month, x.store_id, MAX(x.rental_count) FROM (
SELECT MONTH(r.rental_date) AS rental_month, i.store_id AS store_id, COUNT(*) AS rental_count 
FROM rental r LEFT JOIN inventory i ON r.inventory_id = i.inventory_id 
WHERE YEAR(r.rental_date) = 2005 
GROUP BY MONTH(r.rental_date), i.store_id 
ORDER BY MONTH(r.rental_date) ASC, COUNT(*) DESC) x 
GROUP BY x.rental_month 

編號: http://kristiannielsen.livejournal.com/6745.html

但後來這是否滿足你,看到你已經有一個工作查詢.. 。

+0

這個查詢和我的子查詢a&c一樣。如果它僅返回月租,商店和每月租金最高的商店的計數,這就是正確的,這正是我想要達到的。從技術上講,您確實能夠輕鬆地從該表中確定哪家商店每月租用更多,但並不完全是我需要執行的查詢。 – user2789945

+0

啊,我剛剛發佈了一個編輯,但讓我看看你的評論,看它是否解決它... – Eugene

+0

我相信編輯解決了評論和意圖? – Eugene