Можете ли вы использовать ОГРАНИЧЕНИЕ ПОРЯДКА ПО (столбцу) с дополнительным столбцом?

#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 предложение, если есть омонимы заголовка