Finding Smallest or Largest Summary Values
Problem
You want to compute per-group summary values, but display only the smallest or largest of them.
Solution
Add a LIMIT clause to the query.
Discussion
MIN( ) and MAX( ) find the
values at the endpoints of a range of values, but if you want to know
the extremes of a set of summary values, those functions
won’t work. The arguments to MIN( ) and MAX( ) cannot be other aggregate
functions. For example, you can easily find per-driver mileage
totals:
mysql>SELECT name, SUM(miles)->FROM driver_log->GROUP BY name;+-------+------------+ | name | SUM(miles) | +-------+------------+ | Ben | 362 | | Henry | 911 | | Suzi | 893 | +-------+------------+
But to select only the record for the driver with the most miles, this doesn’t work:
mysql>SELECT name, SUM(miles)->FROM driver_log->GROUP BY name->HAVING SUM(miles) = MAX(SUM(miles));ERROR 1111 at line 1: Invalid use of group function
Instead, order the rows with the largest SUM( )
values first and use LIMIT to select the first
record:
mysql>SELECT name, SUM(miles) AS 'total miles'->FROM driver_log->GROUP BY name->ORDER BY 'total miles' DESC LIMIT 1;+-------+-------------+ | name | total miles | +-------+-------------+ | Henry | 911 | +-------+-------------+
An alias is used in the ORDER
BY clause because ORDER
BY cannot refer directly to aggregate functions,
as discussed earlier in Recipe 7.14.
Note that if there is more than one row with the given summary value, this type of query ...