MySQL выбрать один столбец DISTINCT, с соответствующими другими столбцами - PullRequest
174 голосов
/ 11 мая 2011
ID   FirstName   LastName
1      John        Doe
2      Bugs        Bunny
3      John        Johnson

Я хочу выбрать DISTINCT результаты из столбца FirstName, но мне нужны соответствующие ID и LastName.

В наборе результатов должен отображаться только один John, но с ID 1 и LastName Доу.

Ответы [ 11 ]

168 голосов
/ 11 мая 2011

попробуйте этот запрос

 SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)
55 голосов
/ 11 мая 2011

Ключевое слово DISTINCT не работает так, как вы ожидаете.Когда вы используете SELECT DISTINCT col1, col2, col3, вы фактически выбираете все уникальные кортежи {col1, col2, col3}.

49 голосов
/ 30 сентября 2014

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 |
21 голосов
/ 03 мая 2012
SELECT ID,LastName 
From TABLE_NAME 
GROUP BY FirstName 
HAVING COUNT(*) >=1
3 голосов
/ 02 декабря 2018

Как насчет

`SELECT 
    my_distinct_column,
    max(col1),
    max(col2),
    max(col3)
    ...
 FROM
    my_table 
 GROUP BY 
    my_distinct_column`
2 голосов
/ 14 февраля 2013
SELECT firstName, ID, LastName from tableName GROUP BY firstName
2 голосов
/ 11 мая 2011

Не уверен, что вы можете сделать это с MySQL, но вы можете использовать CTE в T-SQL

; WITH tmpPeople AS (
 SELECT 
   DISTINCT(FirstName),
   MIN(Id)      
 FROM People
)
SELECT
 tP.Id,
 tP.FirstName,
 P.LastName
FROM tmpPeople tP
JOIN People P ON tP.Id = P.Id

В противном случае вам, возможно, придется использовать временную таблицу.

0 голосов
/ 02 марта 2016

Имейте в виду, что при использовании группировки по группам и по порядку MySQL является ЕДИНСТВЕННОЙ базой данных, которая позволяет использовать столбцы в группе по группам и / или упорядочивать по частям, которые не являются частью оператора выбора.

Так, например: выберите столбец1 из группы таблиц по столбцу2, порядок по столбцу3

, который не будет работать в других базах данных, таких как Postgres, Oracle, MSSQL и т. Д. В этих базах данных необходимо выполнить следующие действия

выберите столбец1, столбец2, столбец3 из группы таблиц по столбцу2, порядок по столбцу3

Просто некоторая информация на случай, если вы когда-нибудь перенесете свой текущий код в другую базу данных или начнете работать в другой базе данных и попытаетесь использовать код повторно.

0 голосов
/ 14 июля 2015
SELECT DISTINCT (column1), column2
FROM table1
GROUP BY column1
0 голосов
/ 04 февраля 2014

Вы можете использовать group by для отображения различных значений, а также соответствующих полей.

select * from tabel_name group by FirstName

Теперь вы получили вывод, подобный этому:

ID    FirstName     LastName
2     Bugs          Bunny
1     John          Doe


Если вы хотите ответитькак

ID    FirstName     LastName
1     John          Doe
2     Bugs          Bunny

, затем используйте этот запрос,

select * from table_name group by FirstName order by ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...