Table of Contents
To select the row with the maximum value by group in MySQL, you can use the MAX() function and the GROUP BY clause. The MAX() function will return the highest value for the specified column, and the GROUP BY clause will group the results by a specific column. This will allow you to retrieve the maximum value for each group. You can then use the ORDER BY clause to sort the results in descending order and limit the results to one row using the LIMIT clause. This will give you the row with the maximum value for each group.
You can use the following syntax in MySQL to select the row with the max value in a particular column, grouped by another column:
SELECT *
FROM athletes a1
WHERE points=(SELECT MAX(a2.points)
FROM athletes a2
WHERE a1.team = a2.team)
This particular example selects the rows with the max value in the points column, grouped by the values in the team column of the table named athletes.
The following example shows how to use this syntax in practice.
Example: Delete Duplicate Rows But Keep Latest in MySQL
Suppose we have the following table named athletes that contains information about various basketball players:
-- create table
CREATE TABLE athletes (
id INT PRIMARY KEY,
team TEXT NOT NULL,
points INT NOT NULL
);
-- insert rows into table
INSERT INTO athletes VALUES (0001, 'Mavs', 22);
INSERT INTO athletes VALUES (0002, 'Mavs', 14);
INSERT INTO athletes VALUES (0003, 'Lakers', 37);
INSERT INTO athletes VALUES (0004, 'Knicks', 19);
INSERT INTO athletes VALUES (0005, 'Knicks', 26);
INSERT INTO athletes VALUES (0006, 'Knicks', 40);
INSERT INTO athletes VALUES (0007, 'Lakers', 21);
INSERT INTO athletes VALUES (0008, 'Celtics', 15);
INSERT INTO athletes VALUES (0009, 'Hawks', 18);
INSERT INTO athletes VALUES (0010, 'Celtics', 23);
-- view all rows in table
SELECT * FROM athletes;
Output:
+----+---------+--------+
| id | team | points |
+----+---------+--------+
| 1 | Mavs | 22 |
| 2 | Mavs | 14 |
| 3 | Lakers | 37 |
| 4 | Knicks | 19 |
| 5 | Knicks | 26 |
| 6 | Knicks | 40 |
| 7 | Lakers | 21 |
| 8 | Celtics | 15 |
| 9 | Hawks | 18 |
| 10 | Celtics | 23 |
+----+---------+--------+
Suppose that we would like to select the rows with the max points value for each team.
We can use the following syntax to do so:
SELECT *
FROM athletes a1
WHERE points=(SELECT MAX(a2.points)
FROM athletes a2
WHERE a1.team = a2.team)
Output:
+----+---------+--------+
| id | team | points |
+----+---------+--------+
| 1 | Mavs | 22 |
| 3 | Lakers | 37 |
| 6 | Knicks | 40 |
| 9 | Hawks | 18 |
| 10 | Celtics | 23 |
+----+---------+--------+
Notice that only the rows with the max value in the points column for each team are returned.
For example, there were three players on the Knicks team in the original table that had the following points values: 19, 26 and 40.
Notice that only the row with the Knicks player who scored 40 is returned from this query.
Additional Resources
The following tutorials explain how to perform other common tasks in MySQL: