EDIT
Оригинальный ответ был написан до MySQL 5.7.5 , который больше не применяется из-за изменений по умолчанию с ONLY_FULL_GROUP_BY
. Также важно отметить, что когда ONLY_FULL_GROUP_BY
отключен, использование GROUP BY
без агрегатной функции даст неожиданные результаты, поскольку MySQL может свободно выбирать значение ANY в пределах сгруппированного набора данных. [так в оригинале] .
Предполагая, что имя и фамилия индексируются однозначно, альтернативой GROUP BY
является сортировка с использованием LEFT JOIN
для фильтрации набора результатов. См. Демонстрацию
Чтобы получить различающееся имя, упорядоченное по фамилии в порядке убывания (Z-A)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Для извлечения отдельного имени, упорядоченного по фамилии в порядке возрастания (A-Z)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
Затем вы можете заказать полученные данные по желанию.
Если комбинация имени и фамилии не уникальна и у вас есть несколько строк с одинаковыми значениями, вы можете отфильтровать результирующий набор, включив условие ИЛИ в объединение, чтобы выбрать конкретный идентификатор. См. Демонстрацию .
имя_таблицы данных :
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
ПРЕДУПРЕЖДЕНИЕ
С MySQL GROUP BY
не всегда даст ожидаемые результаты при использовании с ORDER BY
См .: Пример тестового примера .
Лучший способ реализации для обеспечения ожидаемых результатов - это отфильтровать область набора результатов, используя подобный подзапрос.
данные имени таблицы :
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')
Запрос
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
#Results
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Versus
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
#Results
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |