Получить строку с наивысшим или самым низким значением из группы GROUP BY

Я пытаюсь получить строку с наивысшим/наименьшим числом после выполнения GROUP BY:

Вот мои тестовые данные

mysql> SELECT * FROM test;
+----+-------+------+
| id | value | name |
+----+-------+------+
|  1 |    10 | row1 |
|  2 |    12 | row2 |
|  3 |    10 | row2 |
|  4 |     5 | row2 |
+----+-------+------+
4 rows in set (0.00 sec)

Чтобы получить самое низкое значение, я буду использовать MIN()

mysql> SELECT id, name, MIN(value) AS value FROM test GROUP BY name;
+----+------+-------+
| id | name | value |
+----+------+-------+
|  1 | row1 |    10 |
|  2 | row2 |     5 |
+----+------+-------+
2 rows in set (0.00 sec)

Теперь id row2 равен 2, но он должен быть 4.

Я также пробовал соединить:

mysql> SELECT t1.* FROM 
       (SELECT id, name, MIN(value) AS value 
          FROM test GROUP BY name) AS t1 
       INNER JOIN test AS t2 ON t1.id = t2.id;
+----+------+-------+
| id | name | value |
+----+------+-------+
|  1 | row1 |    10 |
|  2 | row2 |     5 |
+----+------+-------+
2 rows in set (0.00 sec)

Как я могу получить правильный идентификатор для каждого результата на основе того, что самый низкий value?

Ответы

Ответ 1

Я думаю, это то, чего вы пытаетесь достичь:

SELECT t.* FROM test t
JOIN 
( SELECT Name, MIN(Value) minVal
  FROM test GROUP BY Name
) t2
ON t.Value = t2.minVal AND t.Name = t2.Name;

Вывод:

╔════╦═══════╦══════╗
║ ID ║ VALUE ║ NAME ║
╠════╬═══════╬══════╣
║  1 ║    10 ║ row1 ║
║  4 ║     5 ║ row2 ║
╚════╩═══════╩══════╝

См. этот SQLFiddle

Здесь я присоединяюсь к таблице с помощью minVal и Name.