2017-02-09 52 views
3

試圖根據樣本表中不同的標準對計數進行簡單的劃分,並根據影片評級進行分組。我正在使用默認使用的MySQL示例SAKILA模式。需要左連接嗎? WHERE條件的行爲與INNER JOIN相似

你可以看到不同的罪名,我期待從這些前兩個查詢看到:

第一個查詢:

SELECT f1.rating, count(f1.title) 
FROM sakila.film f1 
WHERE f1.title like '%BA%' 
GROUP BY rating 
ORDER BY rating ASC 

第一次查詢結果:

rating count(f1.title) 
    G  4 
    PG  5 
    PG-13 8 
    R  6 
    NC-17 6 

第二個查詢:

SELECT f1.rating, count(f1.title) 
FROM sakila.film f1 
WHERE f1.title like '%AM%' 
GROUP BY rating 
ORDER BY rating ASC 

個第二個查詢結果:

rating count(f1.title) 
    G  8 
    PG  6 
    PG-13 9 
    R  18 
    NC-17 7 

什麼我之後是對G等級有4/8的劃分,爲PG評級有5/6的劃分,等等。

我希望以下查詢能夠完成這個計算,但是對於我來說,LEFT JOIN看起來像是一個INNER JOIN,因爲這兩個WHERE條件只導致1個包含'BA'以及'AM 」,這就是爲什麼結果是什麼,它是:

疑難QUERY:

SELECT f1.rating, count(f1.title)/count(f2.title) 
FROM sakila.film f1 
LEFT JOIN sakila.film f2 
ON f1.film_id = f2.film_id 
WHERE f1.title like '%BA%' 
AND f2.title like '%AM%' 
GROUP BY rating 
ORDER BY rating ASC 

疑難查詢結果:

rating count(f1.title)/count(f2.title) 
    PG-13 1.0000 

我怎麼能莫迪如果有問題的查詢將計數從前兩個查詢中按計劃劃分並按分組進行分組?我是否需要使用UNION ALL重寫查詢,還是可以在這種情況下使用LEFT JOIN?

在此先感謝。

回答

3

可以使用條件聚集在這裏:

SELECT rating, 
     SUM(CASE WHEN title LIKE '%BA%' THEN 1 ELSE 0 END)/
     SUM(CASE WHEN title LIKE '%AM%' THEN 1 ELSE 0 END) AS the_ratio 
FROM sakila.film 
GROUP BY rating 
ORDER BY rating ASC 

注意,目前做的方法自連接,我認爲在錯誤的方向前進。相反,我們可以對整個表進行一次掃描,併爲每個rating組計算各種標題。

+0

偉大工程算,感謝這麼多的快速響應及解釋 –

+0

嗨西德尼,請開啓一個新問題,而不是粘貼在這裏作爲評論。 –

+0

這是,謝謝: http://stackoverflow.com/questions/42130476/calculating-acceptance-ratio-with-left-join-and-self-join-and-aggregate-function –

1

您不需要任何連接。

SELECT 
    rating, 
    count(if (title like '%BA%', 1, null))/count(if (title like '%AM%', 1, null)) 
FROM sakila.film 
GROUP BY 1 
ORDER BY 1 

組由1 /順序由1表示在選擇

數第一列將不會在任何空值

+0

很好,謝謝你快速的迴應 –