I want to find out the Top 10 rented movies in the sakila db. It must be sorted DESC after total_rentals and secondary after film title. My solution looks like this and works so far without the film title:
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 ;
However, I can’t sort it after film.title due to syntax error(Error 1064).
Can someone help me out?
Advertisement
Answer
Is this what you want?
ORDER BY total_rentals DESC, f.title LIMIT 10
This guarantees just 10 rows in the resultset, sorted by descending total_rentals
, then by film title.
Another way to read your question: give me the 10 best rental scores, and the associated movies – which may yield more than 10 rows if there are ties. In that case, I would recommend window functions (available in 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
Notes:
COUNT(*)
is more efficient thanCOUNT(<something>)
and is equivalent hereI wouldn’t expect “orphan” rows in
rental
; if so,INNER JOIN
s are more appropriate thanLEFT JOIN
sIt is probably a good idea to add
film_id
to theGROUP BY
clause, in case there are title homonyms