Как SELECT DISTINCT работает в MySQL? - PullRequest
5 голосов
/ 16 сентября 2011

У меня есть таблица с несколькими строками, которые имеют одинаковые данные.Я использовал SELECT DISTINCT, чтобы получить уникальный ряд, и он отлично работает.Но когда я использую ORDER BY с SELECT DISTINCT, это дает мне несортированные данные.

Может кто-нибудь сказать мне, как работает отдельный?

Ответы [ 3 ]

2 голосов
/ 20 сентября 2011

Из вашего комментария ранее, запрос, который вы пытаетесь выполнить, является

Select distinct id from table where id2 =12312 order by time desc.

Как я и ожидал, вот ваша проблема.Ваш столбец выбора и порядок по столбцу различны.Ваши выходные строки упорядочены по времени, но этот порядок не обязательно должен сохраняться в столбце id.Вот пример.

id  | id2    | time
-------------------
1   | 12312  | 34
2   | 12312  | 12
3   | 12312  | 48

Если вы запустите

SELECT * FROM table WHERE id2=12312 ORDER BY time DESC

, вы получите следующий результат

id  | id2    | time
-------------------
2   | 12312  | 12
1   | 12312  | 34
3   | 12312  | 48

Теперь, если вы выберите только столбец id изэто, вы получите

id
--
2
1
3

Вот почему ваши результаты не отсортированы.

1 голос
/ 16 сентября 2011

Когда вы укажете SELECT DISTINCT, он выдаст вам все строки, удалив дубликаты из набора результатов.Под «дубликатами» я подразумеваю строки, в которых все поля имеют одинаковые значения.Например, скажем, у вас есть таблица, которая выглядит следующим образом:

 id  |  num
 --------------
 1   |  1 
 2   |  3
 3   |  3

SELECT DISTINCT * вернет все строки выше, тогда как SELECT DISTINCT num вернет две строки:

num
-----
1
3

Обратите внимание, чтокакая строка фактическая строка (например: строка 2 или строка 3), которую она выбирает, не имеет значения, так как результат будет неразличимым.

Наконец, DISTINCT должно не повлиять на то, как ORDER BY работает.

Ссылка: MySQL SELECT оператор

0 голосов
/ 12 октября 2017

Поведение, которое вы описываете, происходит, когда вы ORDER BY выражаете выражение, отсутствующее в предложении SELECT.Стандарт SQL не допускает такой запрос, но MySQL менее строг и разрешает его.

Давайте попробуем пример:

SELECT DISTINCT colum1, column2
FROM table1
WHERE ...
ORDER BY column3

Допустим, содержимое таблицы table1:

 id | column1 | column2 | column3
----+---------+---------+---------
  1 | A       | B       | 1
  2 | A       | B       | 5
  3 | X       | Y       | 3

Без предложения ORDER BY приведенный выше запрос возвращает следующие две записи (без ORDER BY порядок не гарантируется):

 column1 | column2
---------+---------
 A       | B
 X       | Y

Но с ORDER BY column3заказ также не гарантирован.

Предложение DISTINCT работает со значениями выражений, присутствующих в предложении SELECT.Если строка # 1 обрабатывается первой, то (A, B) помещается в набор результатов и связывается со строкой # 1.Затем, когда строка № 2 обрабатывается, значения выражений SELECT создают запись (A, B), которая уже находится в наборе результатов.Из-за DISTINCT оно сброшено.Строка # 3 производит (X, Y), которая также помещается в набор результатов.Затем в предложении ORDER BY column3 записи сортируются в результирующем наборе как (A, B), (X, Y).

Но если строка № 2 обрабатываетсязатем перед строкой # 1, следуя той же логике, что и в предыдущем абзаце, записи в наборе результатов сортируются как (X, Y), (A, B).

На ядро ​​базы данных не накладывается никаких правил в отношении порядка, в котором он обрабатывает строки при выполнении запроса.База данных может свободно обрабатывать строки в любом порядке, который, по ее мнению, лучше для производительности.

Ваш запрос недопустим в SQL, и тот факт, что он может возвращать разные результаты, используя одни и те же входные данные, подтверждает это.

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