Проблема агрегатной функции MySQL - PullRequest
8 голосов
/ 04 сентября 2011

В следующем примере, почему запрос min() возвращает результаты, а запрос max() - нет?

mysql> create table t(id int, a int);
Query OK, 0 rows affected (0.10 sec)

mysql> insert into t(id, a) values(1, 1);
Query OK, 1 row affected (0.03 sec)

mysql> insert into t(id, a) values(1, 2);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t
    -> ;
+------+------+
| id   | a    |
+------+------+
|    1 |    1 |
|    1 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from t where a < 4;
+------+------+
| id   | a    |
+------+------+
|    1 |    1 |
|    1 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from t where a < 4 having a = max(a);
Empty set (0.00 sec)

mysql> select * from t where a < 4 having a = min(a);
+------+------+
| id   | a    |
+------+------+
|    1 |    1 |
+------+------+
1 row in set (0.00 sec)

1 Ответ

7 голосов
/ 04 сентября 2011

Предложение HAVING используется для фильтрации групп строк.Вы ссылаетесь на min(a) и max(a), которые (при отсутствии какого-либо предложения GROUP BY) агрегируются по всем a значениям в таблице, но затем используете сравнение с одним значением a.

Так какое значение a должен использовать MySQL?Все другие РСУБД, о которых я знаю, на этом этапе выдают ошибку, однако MySQL это допускает. Из документов

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

Таким образом, в вашем случае из результатов, которые вы получаете, кажется, что он в итоге использовал 1 в качестве скалярного значения для aно такое поведение не гарантируется, и с таким же успехом могло бы использоваться 2 или любое другое существующее значение a.

...