Почему следующий запрос возвращает другой результат при запуске на MySQL 5.7? [Дубликат]

Если вы не пишете библиотеку или не имеете особых причин, вы можете забыть о inline и использовать оптимизацию времени ссылки . Он устраняет требование определения определения функции в заголовке, чтобы оно учитывалось для вложения между единицами компиляции, что и позволяет inline.

(Но см. Есть ли какая-либо причина почему бы не использовать оптимизацию времени ссылки? )

37
задан Harish Shetty 28 January 2013 в 11:09
поделиться

8 ответов

Прочитайте документацию по MySQL в этой конкретной точке.

В двух словах, MySQL позволяет исключить некоторые столбцы из GROUP BY для достижения производительности, однако это работает только если опущенные столбцы имеют одно и то же значение (внутри группировки), в противном случае значение, возвращаемое запросом, действительно неопределенно, как и догадываются другими в этом сообщении. Разумеется, добавление предложения ORDER BY не приведет к повторному введению какой-либо формы детерминированного поведения.

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

Выдержка из документации MySQL 5.0:

When using this feature, all rows in each group should have the same values
for the columns that are omitted from the GROUP BY part. The server is free
to return any value from the group, so the results are indeterminate unless
all values are the same. 
34
ответ дан mjv 25 August 2018 в 15:54
поделиться

Если вы группируете по отделам, имеет ли значение другие данные? Я знаю, что Sql Server даже не разрешит этот запрос. Если есть вероятность, что это звучит, возможно, могут возникнуть другие проблемы.

-1
ответ дан CSharpAtl 25 August 2018 в 15:54
поделиться

Перед запросом вы можете поместить a:

SET sql_mode = 'ONLY_FULL_GROUP_BY'

, чтобы обеспечить выполнение стандартного поведения SQL GROUP BY

2
ответ дан cube.head 25 August 2018 в 15:54
поделиться

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

Заказ выполняется только после выполнения GROUP BY

4
ответ дан Joel L 25 August 2018 в 15:54
поделиться

Попробуйте использовать ORDER BY, чтобы выбрать нужную строку.

SELECT * FROM emp GROUP BY dept ORDER BY name ASC;

Вернет следующее:

name   dept    salary
-----  -----   -----
jack   a       2
fred   b       1
-1
ответ дан Marius 25 August 2018 в 15:54
поделиться

Я думаю, что ANSI SQL требует, чтобы выбор включал только поля из предложения GROUP BY, а также агрегатные функции. Такое поведение MySQL выглядит как возврат некоторой строки, возможно, последней, прочитанной сервером, или любой строки, которую она имела под рукой, но не полагайтесь на это.

0
ответ дан Petruza 25 August 2018 в 15:54
поделиться

Я считаю, что самое лучшее, что нужно сделать, это рассмотреть этот тип запроса без поддержки. В большинстве других систем баз данных вы не можете включать столбцы, которые не находятся в предложении GROUP BY или в агрегатной функции в предложениях HAVING, SELECT или ORDER BY.

Вместо этого учтите, что ваш запрос читает:

SELECT ANY(name), dept, ANY(salary)
FROM emp 
GROUP BY dept;

... поскольку это то, что происходит.

Надеюсь, это поможет ....

1
ответ дан Rob Farley 25 August 2018 в 15:54
поделиться

Это немного поздно, но я расскажу об этом для будущей справки.

GROUP BY берет первую строку с дубликатом и отбрасывает любые строки, которые соответствуют после нее в наборе результатов , Итак, если у Джека и Тома есть тот же отдел, кто бы ни появился первым в обычном SELECT, это будет результирующая строка в GROUP BY.

Если вы хотите контролировать то, что появляется первым в списке, вам нужно сделать ORDER BY. Однако SQL не позволяет ORDER BY перейти к GROUP BY, поскольку это вызовет исключение. Лучшим обходным решением этой проблемы является выполнение ORDER BY в подзапросе, а затем GROUP BY во внешнем запросе. Вот пример:

SELECT * FROM (SELECT * FROM emp ORDER BY name) as foo GROUP BY dept

Это самая эффективная техника, которую я нашел. Я надеюсь, что это поможет кому-то.

10
ответ дан Samuel Hodge 25 August 2018 в 15:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: