PostgreSQL - Какой фильм самый популярный в категории «Спорт»? - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь ответить на конкретный вопрос «Какой фильм самый популярный в категории« Спорт »?»Я пробовал это

WITH CustomerRentalsPerStore AS
(
    SELECT  R.customer_id, I.category_id,  COUNT (R.inventory_id) as rental_count 
    from    rental AS R
            INNER JOIN inventory AS I 
                on R.inventory_id = I.inventory_id
    GROUP BY customer_id, I.category_id
    --ORDER BY COUNT (R.inventory_id) desc
)

SELECT c.customer_id, c.first_name, c.last_name, cr.rental_count, cr.store_id 
FROM    Customer C
        INNER JOIN CustomerRentalsPerStore CR
            on  C.customer_id = CR.customer_id
where   cr.rental_count = (SELECT MAX(rental_count) FROM CustomerRentalsPerStore)       
 AND CR.category_id='Sports'

Вот диаграммы ER:

Here are the ER Diagrams

Любая помощь будет оценена!Спасибо

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Другой подход заключается в том, чтобы сначала сделать / ограничить выбор как можно меньшим, прежде чем приступить к обработке GROUP BY и COUNT(*).Оптимизатор может выбрать лучший способ выполнения, но это будет зависеть от индексации.

    SELECT 
       film.title  
     , COUNT(*)
    FROM (
      SELECT 
        category.category_id
      FROM 
        category    
      INNER JOIN
        film_category
      ON
        category.category_id = film_category.category_id   
      INNER JOIN 
       film 
      ON
        film_category.category_id = film.film_id
      INNER JOIN
        inventory 
      ON
        film.film_id = inventory.film_id 
      INNER JOIN
        rental 
      ON
        inventory.film_id= rental.inventory_id   
      WHERE
        category.name = 'Sports'     
    ) AS alias
    INNER JOIN 
     film
    ON
      alias.film_id = film.film_id
    GROUP BY 
     film.title   
    ORDER BY
     COUNT(*) DESC
   LIMIT 1
0 голосов
/ 27 ноября 2018

Исходя из того, что вы разъяснили для меня фильм с наибольшим количеством прокатов в спортивной категории , у меня есть следующий непроверенный SQL, который должен дать вам результат:

SELECT  f.title, COUNT(*) AS RentalCount
  FROM  film f
    INNER JOIN film_category fc ON fc.film_id = f.film_id
    INNER JOIN category c ON c.category_id = fc.category_id
    INNER JOIN inventory i ON i.film_id = f.film_id
    INNER JOIN rental r ON r.inventory_id = i.inventory_id
  WHERE (c.name = 'Sports')
  GROUP BY f.title
  ORDER BY 2 DESC;

Эффективно получает количество всех прокатов (COUNT) для всех фильмов в категории «Спорт».Очевидно, вам нужен только первый результат, поэтому просто ограничьте вывод одной строкой.

Код не проверен, но должен указывать правильное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...