Те же условия, другой результат?
Прочитав документацию по 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 для столбца, не сгруппированного с возможным изменением в этом столбце, наблюдаемое расхождение является ожидаемым поведением в значительной степени.