Если вы не пишете библиотеку или не имеете особых причин, вы можете забыть о inline
и использовать оптимизацию времени ссылки . Он устраняет требование определения определения функции в заголовке, чтобы оно учитывалось для вложения между единицами компиляции, что и позволяет inline
.
(Но см. Есть ли какая-либо причина почему бы не использовать оптимизацию времени ссылки? )
Прочитайте документацию по 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.
Если вы группируете по отделам, имеет ли значение другие данные? Я знаю, что Sql Server даже не разрешит этот запрос. Если есть вероятность, что это звучит, возможно, могут возникнуть другие проблемы.
Перед запросом вы можете поместить a:
SET sql_mode = 'ONLY_FULL_GROUP_BY'
, чтобы обеспечить выполнение стандартного поведения SQL GROUP BY
Насколько я знаю, для ваших целей конкретные возвращаемые строки могут быть рассмотрены как случайные.
Заказ выполняется только после выполнения GROUP BY
Попробуйте использовать ORDER BY, чтобы выбрать нужную строку.
SELECT * FROM emp GROUP BY dept ORDER BY name ASC;
Вернет следующее:
name dept salary
----- ----- -----
jack a 2
fred b 1
Я думаю, что ANSI SQL требует, чтобы выбор включал только поля из предложения GROUP BY, а также агрегатные функции. Такое поведение MySQL выглядит как возврат некоторой строки, возможно, последней, прочитанной сервером, или любой строки, которую она имела под рукой, но не полагайтесь на это.
Я считаю, что самое лучшее, что нужно сделать, это рассмотреть этот тип запроса без поддержки. В большинстве других систем баз данных вы не можете включать столбцы, которые не находятся в предложении GROUP BY или в агрегатной функции в предложениях HAVING, SELECT или ORDER BY.
Вместо этого учтите, что ваш запрос читает:
SELECT ANY(name), dept, ANY(salary)
FROM emp
GROUP BY dept;
... поскольку это то, что происходит.
Надеюсь, это поможет ....
Это немного поздно, но я расскажу об этом для будущей справки.
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
Это самая эффективная техника, которую я нашел. Я надеюсь, что это поможет кому-то.