ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
Я хочу выбрать DISTINCT
результаты из FirstName
столбца, но мне нужны соответствующие ID
и LastName
.
Результирующий набор должен показывать только один John
, но с ID
1 и с LastName
Doe.
DISTINCT
это не функция. Все ответы сDISTINCT()
ошибками. Ошибка появится, когда вы не разместите ее послеSELECT
.ALL
ответы, использующие скобки после слова «отличное», действительно неверны. Distinct НЕ является функцией, поэтому он не может принимать параметр. Скобки, следующие за различными, просто игнорируются. Если вы не используете PostgreSQL, где круглые скобки образуют «сложный тип данных»Ответы:
попробуйте этот запрос
источник
5.7.5+
для измененнойGROUP BY
обработкиDISTINCT
Ключевое слово на самом деле не работает так , как вы ожидаете его. Когда вы используете,SELECT DISTINCT col1, col2, col3
вы фактически выбираете все уникальные кортежи {col1, col2, col3}.источник
Чтобы избежать потенциально неожиданных результатов при использовании
GROUP BY
без агрегатной функции, как это используется в принятом ответе , потому что MySQL может свободно получить ЛЮБОЕ значение в наборе данных, сгруппированных, когда не используется агрегатная функция [sic] и возникают проблемыONLY_FULL_GROUP_BY
. Пожалуйста, рассмотрите возможность использования исключающего соединения.Присоединение к исключению - однозначные объекты
Предполагая, что имя и фамилия индексируются однозначно (однозначно) , альтернативой
GROUP BY
является сортировка с использованиемLEFT JOIN
для фильтрации набора результатов, иначе называемого исключением JOIN.Посмотреть демонстрацию
Восходящий порядок (AZ)
Чтобы получить отличное имя, упорядоченное по фамилии из AZ
запрос
результат
По убыванию (ZA)
Чтобы получить отличное имя, упорядоченное по фамилии из ZA
запрос
результат
Затем вы можете заказать полученные данные по желанию.
Присоединение к исключению - неоднозначные сущности
Если комбинация имени и фамилии не является уникальной (неоднозначной) и у вас есть несколько строк с одинаковыми значениями, вы можете отфильтровать результирующий набор, включив условие ИЛИ в критерии JOIN, чтобы также выполнить фильтрацию по идентификатору.
Посмотреть демонстрацию
данные таблицы
запрос
результат
Заказанный подзапрос
РЕДАКТИРОВАТЬ
Мой оригинальный ответ, использующий упорядоченный подзапрос , был написан до MySQL 5.7.5 , которая больше не применима, из-за изменений с
ONLY_FULL_GROUP_BY
. Пожалуйста, используйте приведенные выше примеры исключений.Также важно отметить; когда
ONLY_FULL_GROUP_BY
отключено (исходное поведение до MySQL 5.7.5) , использованиеGROUP BY
без агрегатной функции может привести к неожиданным результатам, потому что MySQL может свободно выбирать ЛЮБОЕ значение в пределах группируемого набора данных [sic] .Значение
ID
илиlastname
значение может быть извлечено , которое не связано с извлеченнойfirstname
строкой.ПРЕДУПРЕЖДЕНИЕ
С MySQL
GROUP BY
может не дать ожидаемых результатов при использовании сORDER BY
См. Пример тестового примера
Лучший способ реализации, чтобы гарантировать ожидаемые результаты, состоит в том, чтобы фильтровать область набора результатов, используя упорядоченный подзапрос.
данные таблицы
запрос
результат
сравнение
Для демонстрации неожиданных результатов при использовании
GROUP BY
в сочетании сORDER BY
запрос
результат
источник
Ordering is done after grouping.
, так что Нет, не в этом сценарии использования, кроме того, MariaDB игнорирует ORDER BY в подзапросах (согласно стандарту SQL) без aLIMIT
. Вы хотели бы использоватьWindow Function
Для получения дополнительной информации вы должны задать свой вопрос в стеке обмена DBA , так как этот вопрос относится к MySQLGROUP BY
можно выбрать любое значение в сгруппированном наборе данных, если только в этих столбцах не используется агрегатная функция для принудительного задания определенного значения. Такlastname
илиid
может прийти из любого из упорядоченных рядов. Исходный пример подзапроса был приемлем по умолчанию в,MySQL <= 5.7.4
но технически все еще страдает от этой проблемы. ХотяORDER BY
это помогает предотвратить случайный выбор, это все же теоретически возможно, но со значительно меньшей вероятностью, чем без использованияORDER BY
подзапроса.источник
HAVING
сделало мой запрос на 50% медленнее.источник
Как насчет
источник
Не уверен, что вы можете сделать это с MySQL, но вы можете использовать CTE в T-SQL
В противном случае вам, возможно, придется использовать временную таблицу.
источник
Как указывает fyrye , принятый ответ относится к более старым версиям MySQL, в которых
ONLY_FULL_GROUP_BY
еще не было представлено. С MySQL 8.0.17 (используется в этом примере), если вы не отключите,ONLY_FULL_GROUP_BY
вы получите следующее сообщение об ошибке:Один из способов обойти это, не упомянутый fyrye , но описанный в https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html , - это применить
ANY_VALUE()
функцию к столбцам, которые не вGROUP BY
пункте (id
иlastName
в этом примере):Как написано в вышеупомянутых документах,
источник
ANY_VALUE()
качестве своего ответа, а комментарии направлены на предотвращение неоднозначных и непредсказуемых наборов результатов. Поскольку, как следует из названия функции, это может привести к получению любого значения из выбранных строк. Я бы предложил использоватьMAX
илиMIN
вместо.Помните, что при использовании группировки по и порядку MySQL является ЕДИНСТВЕННОЙ базой данных, которая позволяет использовать столбцы в группе по и / или по порядку, которые не являются частью оператора выбора.
Так, например: выберите column1 из группы таблиц по column2, порядок по column3
Это не будет работать в других базах данных, таких как Postgres, Oracle, MSSQL и т. Д. В этих базах данных вам нужно будет сделать следующее
выберите столбец1, столбец2, столбец3 из группы таблиц по столбцу2, порядок по столбцу3
Просто некоторая информация на случай, если вы когда-нибудь перенесете свой текущий код в другую базу данных или начнете работать в другой базе данных и попытаетесь повторно использовать код.
источник
Вы можете использовать group by для отображения различных значений, а также соответствующих полей.
Теперь вы получили такой вывод:
Если вы хотите ответить как
затем используйте этот запрос,
источник
Будет лучшим выбором ИМО
источник
источник
DISTINCT()
это не функция. Также DISTINCT и GROUP BY делают одно и то же, поэтому нет причин ставить их обоих.