#mysql #sql #count #left-join #sql-order-by
#mysql #sql #количество #левое соединение #sql-order-by
Вопрос:
Я хочу узнать 10 лучших фильмов, взятых напрокат, в базе данных sakila. Он должен быть отсортирован по убыванию после total_rentals и вторично после названия фильма. Мое решение выглядит так и работает до сих пор без названия фильма:
SELECT COUNT(rental_date) AS total_rentals, f.title
FROM rental r
LEFT JOIN inventory i USING (inventory_id)
LEFT JOIN film f USING (film_id)
Group by f.title
ORDER BY total_rentals DESC LIMIT 10, f.title
;
Однако я не могу отсортировать его после film.title из-за синтаксической ошибки (ошибка 1064).
Может кто-нибудь мне помочь?
Комментарии:
1.
LIMIT
идет послеORDER BY
, а не в середине.
Ответ №1:
Это то, что вы хотите?
ORDER BY total_rentals DESC, f.title LIMIT 10
Это гарантирует только 10 строк в результирующем наборе, отсортированных по убыванию total_rentals
, а затем по названию фильма.
Еще один способ прочитать ваш вопрос: дайте мне 10 лучших результатов проката и связанные фильмы, которые могут дать более 10 строк, если есть связи. В этом случае я бы рекомендовал оконные функции (доступные в MySLA 8.0)
SELECT *
FROM (
SELECT COUNT(*) AS total_rentals, f.title,
DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) rn
FROM rental r
INNER JOIN inventory i USING (inventory_id)
INNER JOIN film f USING (film_id)
GROUP BY film_id, f.title
) t
WHERE rn <= 10
ORDER BY total_rentals DESC, title
Примечания:
COUNT(*)
более эффективно, чемCOUNT(<something>)
и эквивалентно здесь- Я бы не ожидал «сиротских» строк в
rental
; если это так,INNER JOIN
s более подходят, чемLEFT JOIN
s - Вероятно, хорошей идеей будет добавить
film_id
вGROUP BY
предложение, если есть омонимы заголовка