2016-04-27 6 views
1

Я работаю с Sakila sample database и пытаюсь получить наиболее просматриваемый фильм по стране. До сих пор мне удалось получить самую просматривалась пленку определенной страны, учитывая его идентификатор со следующим запросом: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

Я признаю, это адский вопрос. Но хорошо, пока это работает.

Объяснение:

  • подзапросов: почти такой же, как у вас уже есть. Без WHERE и LIMIT. В результате в списке фильмов-подсчитывать на страну
  • Результат, который, сгруппированных в стране
  • 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

Это, кажется, работает правильно, вероятно, из-за того, что мой subquerry не является правильным – lluchmk

+1

Вы верны. Я пропустил страну «GROUP BY». Я обновил свой ответ, вы можете перепроверить? –

+0

Вот и все! Большое вам спасибо, он работает правильно – lluchmk