Как mySQL GROUP BY и SELECT DISTINCT () влияют на вывод данных при одинаковых значениях? - PullRequest
1 голос
/ 21 марта 2012

ОБНОВЛЕНО РЕДАКТИРОВАНИЕ: Будут ли DISTINCT или GROUP BY произвольно использовать другие поля в запросе, чтобы исключить дубликаты, или выбрать верхнюю строку, или каким-либо образом учесть ORDER BY?

У меня есть запрос монстра, где я работаю с большим количеством соединенных таблиц, я хотел бы опубликовать все это, но его проприетарное, так что кусочков и кусочков будет достаточно, но здесь идет пример в сборе - я пытаюсь чтобы точно выяснить, что делает MySQL, когда он группирует и выводит строки, основываясь на следующем типе запроса (в действительности это около 2 страниц).

Версия 1 - предназначена для устранения дубликатов записей ID2

SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS 
DISTINCT ID1
, ID2
, ID2_Sequence
, DATE1
, DATE2
, <SECRET GUTS OMITTED>
GROUP BY ID2
ORDER BY DATE1 DESC
 *sometimes ORDER BY DATE2 DESC*

Версия 2 - предназначена для показа всех записей

SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS 
DISTINCT ID1
, ID2
, ID2_Sequence
, DATE1
, DATE2
, <SECRET GUTS OMITTED>
GROUP BY ID1
ORDER BY DATE1 DESC
*sometimes ORDER BY DATE2 DESC*

Есть несколько других объединений, которые являются частью этого, но я думаю, что это суть этого. Основная проблема, с которой приходится бороться и почему мы исключаем дубликаты, заключается в том, что существуют однозначные ID1-ID2 и ID2 на основе другого поля для последовательности ID2.

При первом рассмотрении данных (около 70 столбцов так сложно определить, что фильтруется), выглядело так, как будто удалялись записи со старым DATE1, но я не уверен, что это так?

Спасибо

1 Ответ

1 голос
/ 21 марта 2012

group by свернет все строки, чьи сгруппированные поля идентичны.select distinct - это то же самое, что и select distinctrow, и применяет «отличный» ко всей строке.Например,

field1  field2  field3
1       1       1        <--- row 1
1       1       2        <--- row 2
1       2       3        <--- row 3
1       1       1        <--- row 4, identical to row 1

Затем выполните следующие запросы:

SELECT * FROM x GROUP BY field1

возвращает одну строку, так как все строки имеют значение SAME field1

SELECT * FROM x GROUP BY field1, field2

, возвращает 2 строки,так как field2 имеет два разных значения

SELECT DISTINCT * FROM X

возвращает 3 строки, так как строки 1 и 4 идентичны, вы получите строки 1,2,3

...