Finding Rows Containing Per-Group Minimum or Maximum Values
Problem
You want to find which row within each group of rows in a table contains the maximum or minimum value for a given column. For example, you want to determine the most expensive painting in your collection for each artist.
Solution
Create a temporary table to hold the per-group maximum or
minimum values, and then join the temporary table with the original
one to pull out the matching row for each group. If you prefer a
single-query solution, use a subquery in the
FROM
clause rather
than a temporary table.
Discussion
Many questions involve finding largest or smallest values in a
particular table column, but it’s also common to want to know what the
other values are in the row that contains the value. For example, when
you are using the artist
and
painting
tables, it’s possible to
answer questions like “What is the most expensive painting in
the collection, and who painted it?” One way to do this is to
store the highest price in a user-defined variable and then use the
variable to identify the row containing the price so that you can
retrieve other columns from it:
mysql>SET @max_price = (SELECT MAX(price) FROM painting);
mysql>SELECT artist.name, painting.title, painting.price
->FROM artist INNER JOIN painting
->ON painting.a_id = artist.a_id
->WHERE painting.price = @max_price;
+----------+---------------+-------+ | name | title | price | +----------+---------------+-------+ | Da Vinci | The Mona Lisa | 87 | +----------+---------------+-------+ ...
Get MySQL Cookbook, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.