Щоб уникнути потенційно несподіваних результатів при використанні GROUP BYбез сукупної функції, як це використовується у прийнятій відповіді , оскільки MySQL може отримати будь-яке значення в групі наборів даних, коли не використовується сукупна функція [sic] та проблеми з ONLY_FULL_GROUP_BY. Подумайте про приєднання до виключення.
Приєднання до виключення - Однозначні сутності
Якщо припустити, що ім’я та прізвище є однозначно індексованими (однозначно) , альтернативою GROUP BYє сортування за допомогою LEFT JOINфільтрувати набір результатів, інакше відомий як виключення ПРИЄДНАЙТЕСЬ.
Див. Демонстрацію
Зростання порядку (AZ)
Для отримання виразного імені, упорядкованого за прізвищем від AZ
Запит
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;
Результат
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
У порядку зменшення (ZA)
Для отримання виразного імені, упорядкованого за прізвищем від ZA
Запит
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;
Результат
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Потім можна замовити отримані дані за бажанням.
Приєднання до виключення - неоднозначні особи
Якщо комбінація імені та прізвища не є унікальною (неоднозначною) і у вас є кілька рядків однакових значень, ви можете відфільтрувати набір результатів, включивши умову АБО за критеріями JOIN, щоб також фільтрувати за id.
Див. Демонстрацію
дані_імен таблиці
(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;
Результат
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
Замовлений запит
EDIT
Моя оригінальна відповідь за допомогою впорядкованого підзапиту була написана до MySQL 5.7.5 , який більше не застосовується через зміни в ONLY_FULL_GROUP_BY. Будь ласка, використовуйте приклади приєднання для виключення вище.
Важливо також зазначити; коли ONLY_FULL_GROUP_BYвін відключений (оригінальна поведінка до MySQL 5.7.5) , використання GROUP BYбез сукупної функції може призвести до несподіваних результатів, оскільки MySQL може обирати будь-яке значення у групі наборів даних [sic] .
Значення a IDабо lastnameзначення може бути отримано, яке не пов'язане з отриманим firstnameрядком.
УВАГА
З 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
Результат
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Порівняння
Щоб продемонструвати несподівані результати при використанні GROUP BYв поєднанні зORDER BY
Запит
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
Результат
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |