Те же условия, другой результат?

Прочитав документацию по MySQL, я не могу объяснить разницу между этими двумя запросами в phpMyAdmin:

SELECT * FROM f_ean GROUP BY ean HAVING type = 'media'

-> дает мне 57059 результатов

SELECT ean, type FROM f_ean GROUP BY ean HAVING type = 'media'

-> дает мне 73201 результатов

Как может отличаться номер результата запроса, показывая только разные столбцы?

2 ответа

Решение

Вы должны использовать WHEREне HAVING если вы пытаетесь фильтровать записи. HAVING используется для применения фильтра после группировки и сортировки.

Несмотря на это, проблема заключается в том, как MySQL использует GROUP BY, GROUP BY следует использовать с заполнителем; MySQL расширяет функциональность для удобства. Вы получаете разные результаты из-за способа сортировки и группировки столбцов.

MySQL расширяет использование GROUP BY так что список выбора может ссылаться на неагрегированные столбцы, не названные в GROUP BY пункт. Это означает, что предыдущий запрос является допустимым в MySQL. Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названные в GROUP BY одинаковы для каждой группы.

Смотрите расширения дляGROUP BY,

MySQL не обещает, какое значение из несгруппированных столбцов будет в результирующем наборе, если вы не укажете с помощью предложения WHERE или функции AGGREGATE (или, возможно, условия JOIN).

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

Следовательно, разумно предположить, что SELECT, выбирая colA, colZ против SELECTing *, может заставить MySQL использовать разные индексы при компиляции результирующего набора, изменяя "воспринимаемый" порядок строк и отображая различные значения.

Если бы вы использовали условие WHERE, это не имело бы значения. ГДЕ условия применяются перед группировкой. Но, поскольку вы используете условие HAVING для столбца, не сгруппированного с возможным изменением в этом столбце, наблюдаемое расхождение является ожидаемым поведением в значительной степени.

Другие вопросы по тегам