Не могу получить уникальные значения - PullRequest
3 голосов
/ 23 октября 2009

Я использую свой sql для получения уникальных значений из базы данных

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

                    SELECT
            DISTINCT(company_name),
            sp_id               
        FROM
            Student_Training
        ORDER BY
            company_name

sp_id является первичным ключом, а затем company_name - это название компании, которое должно быть уникальным

выглядит следующим образом

sp_id, company_name
1      comp1
2      comp2
3      comp2
4      comp3

Просто не сортировать этот уникальный

Ответы [ 4 ]

7 голосов
/ 23 октября 2009

DISTINCT работает глобально, на всех выбранных вами столбцах.Здесь вы получаете пары значений (sp_id, company_name), но отдельные значения каждого столбца могут содержать дубликаты.

При этом крайне обманчиво то, что MySQL авторизует синтаксисSELECT DISTINCT(company_name), sp_id когда это действительно означает SELECT DISTINCT(company_name, sp_id).Кстати, вам вообще не нужны круглые скобки.

Редактировать

На самом деле есть причина, по которой DISTINCT(company_name), sp_id является допустимым синтаксисом: добавление скобок вокруг выражениявсегда допустимо, хотя это может быть излишне: company_name - это то же самое, что (company_name) или даже (((company_name))).Следовательно, в действительности этот фрагмент SQL означает: «DISTINCT [имя_компании в скобках], [sp_id]».Скобки присоединяются к имени столбца, а не к ключевому слову DISTINCT, которое, в отличие, например, от имен агрегатных функций, не нуждается в скобках (AVG sp_id недопустимо, даже если однозначно для читателя, это всегда AVG(sp_id).)

Впрочем, вы можете написать SELECT DISTINCT company_name, (sp_id) или SELECT DISTINCT (company_name), (sp_id), это точно так же, как обычный синтаксис без скобок.Помещение списка столбцов в круглые скобки - (company_name, sp_id) - не является допустимым синтаксисом SQL, однако вы можете ВЫБРАТЬ только «простые» списки столбцов без скобок (средство проверки орфографии формы говорит мне, что это последнее выражение не английское слово, но яв конце концов, сегодня пятница, во второй половине дня).

Поэтому любой движок базы данных должен принять такой запутанный синтаксис: - (

6 голосов
/ 23 октября 2009

DISTINCT создаст уникальные строки, что означает уникальную комбинацию значений полей в вашем запросе.

Следующий запрос вернет список всех уникальных company_name вместе с первым совпадением для sp_id.

SELECT sp_id, company_name
FROM Student_Training
GROUP BY company_name

И, как предположил Артур Ройтенауэр, действительно обманывает тот факт, что MySQL допускает синтаксис DISTINCT(fieldname), когда он фактически означает DISTINCT(field1, field2, ..., fieldn)

3 голосов
/ 23 октября 2009

Какой id вы хотите в случае, если один company_name имеет два или более id?

Это:

SELECT  DISTINCT company_name                 
FROM    Student_Training

выберет только company_name.

Это:

SELECT  company_name, MIN(id)
FROM    Student_Training
GROUP BY
        company_name

выберет минимальное id для каждого названия компании.

2 голосов
/ 23 октября 2009

DISTINCT работает не так, как вы думаете. Это дает вам отчет. Остановитесь и подумайте о том, как он может вернуть то, что вы ожидаете, что он вернется. Если у вас была следующая таблица

id    name
1     joe
2     joe
3     james

Если бы он только возвращал разные имена, какой идентификатор он бы возвратил для Джо?

Вы можете хотеть

SELECT company_name, Min(sp_id) FROM Student_Tracking GROUP BY company_name

или, возможно, (как указано выше) просто

SELECT DISTINCT company_name from student_training
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...