2016-04-27 197 views
1

我正在與Sakila sample database合作,並試圖獲得每個國家/地區最受歡迎的電影。到目前爲止,我設法給它的ID與下面的查詢某個國家的觀看次數最多的影片:MySQL相關子查詢FROM

SELECT 
    F.title, CO.country, count(F.film_id) as times 
FROM 
    customer C 
INNER JOIN 
    address A ON C.address_id = A.address_id 
INNER JOIN 
    city CI ON A.city_id = CI.city_id 
INNER JOIN 
    country CO ON CI.country_id = CO.country_id 
INNER JOIN 
    rental R ON C.customer_id = R.customer_id 
INNER JOIN 
    inventory I ON R.inventory_id = I.inventory_id 
INNER JOIN 
    film F ON I.film_id = F.film_id 
WHERE 
    CO.country_id = 1 
GROUP BY 
    F.film_id 
ORDER BY 
    times DESC 
LIMIT 1; 

我supose,我將不得不使用此查詢或在另一形式類似的東西查詢,但我已經嘗試了所有我能想到的,完全無法弄清楚如何去做。

提前致謝!

回答

2

我承認,這是一個查詢的地獄。但是,只要它有效。

說明:

  • 子查詢:當你已經差不多了。沒有WHERELIMIT。導致每個國家的電影數量列表
  • 結果,按國家/地區分組
  • GROUP_CONCAT(title ORDER BY times DESC SEPARATOR '|||')將給出該'行'中的所有標題,其中觀看次數最高的標題在第一位。分隔符無關緊要,只要你確定它永遠不會出現在標題中。
  • SUBSTRING_INDEX('...', '|||', 1)結果中的字符串的第一部分,直到它找到|||,在這種情況下,第一(且因此觀看次數最多的)標題

完整查詢:

SELECT 
    country_name, 
    SUBSTRING_INDEX(
     GROUP_CONCAT(title ORDER BY times DESC SEPARATOR '|||'), 
     '|||', 1 
    ) as title, 
    MAX(times) 
FROM (
    SELECT 
     F.title AS title, 
     CO.country_id AS country_id, 
     CO.country AS country_name, 
     count(F.film_id) as times 
    FROM customer C INNER JOIN address A ON C.address_id = A.address_id 
    INNER JOIN city CI ON A.city_id = CI.city_id 
    INNER JOIN country CO ON CI.country_id = CO.country_id 
    INNER JOIN rental R ON C.customer_id = R.customer_id 
    INNER JOIN inventory I ON R.inventory_id = I.inventory_id 
    INNER JOIN film F ON I.film_id = F.film_id 
    GROUP BY F.film_id, CO.country_id 
) AS count_per_movie_per_country 
GROUP BY country_id 

概念證明(只要子查詢是正確的):SQLFiddle

+0

這doesen't似乎工作正常,至少可能是由於我的subquerry不正確 – lluchmk

+1

你是對的。我錯過了一個「GROUP BY」國家。我已經更新了我的答案,你能重新檢查嗎? –

+0

就是這樣!非常感謝,它工作正常 – lluchmk