Я часто вижу, как люди отвечают на вопросы MySQL такими запросами:
SELECT DAY(date), other columns
FROM table
GROUP BY DAY(date);
SELECT somecolumn, COUNT(*)
FROM table
HAVING COUNT(*) > 1;
Мне всегда нравится давать столбцу псевдоним и ссылаться на него в предложении GROUP BY
или HAVING
, например.
SELECT DAY(date) AS day, other columns
FROM table
GROUP BY day;
SELECT somecolumn, COUNT(*) AS c
FROM table
HAVING c > 1;
Достаточно ли умен MySQL, чтобы заметить, что выражения в более поздних предложениях такие же, как в SELECT
, и делают это только один раз? Я не уверен, как это проверить - EXPLAIN
не показывает никакой разницы, но, похоже, он вообще не показывает, как он выполняет группировку или фильтрацию; это кажется в основном полезным для оптимизации соединений и предложений WHERE
.
Я склонен пессимистично относиться к оптимизации MySQL, поэтому мне нравится оказывать ей всю возможную помощь.
SELECT RAND() FROM table ORDER BY RAND()
, поскольку результирующий столбец действительно отсортирован, MySQL должен использовать одно и то же значение для обоих вызововRAND()
. - person eggyal   schedule 23.05.2014GROUP BY
. - person Barmar   schedule 23.05.2014GROUP BY
реализуется путем выполнения сортировки... - person eggyal   schedule 23.05.2014