SQL-запрос группируется по тем местам, откуда возвращаются неверные данные - PullRequest
1 голос
/ 29 августа 2011

Учитывая приведенный ниже код SQL:

create table A(a integer, b integer, c double);

insert into A(a, b, c)
values
(0, 0, 1.1),(1, 0, 1.2),(2, 0, 1.3),
(0, 1, 1.4),(1, 1, 1.5),(2, 1, 1.6),
(0, 2, 1.7),(1, 2, 1.8),(2, 2, 1.9),
(0, 0, 1.9),(1, 0, 1.8),(2, 0, 1.7),
(0, 1, 1.6),(1, 1, 1.5),(2, 1, 1.4),
(0, 2, 1.3),(1, 2, 1.2),(2, 2, 1.1)

mysql> select * from A where a = 0;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    0 |    0 |  1.1 |
|    0 |    1 |  1.4 |
|    0 |    2 |  1.7 |
|    0 |    0 |  1.9 |
|    0 |    1 |  1.6 |
|    0 |    2 |  1.3 |
+------+------+------+

mysql> select * from A where a = 0 group by b;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    0 |    0 |  1.1 |
|    0 |    1 |  1.4 |
|    0 |    2 |  1.7 |
+------+------+------+
3 rows in set (0.00 sec)

Почему 3 ряда? Я бы подумал, что оба запроса должны возвращать один и тот же результат, поскольку существуют уникальные комбинации c.

Далее

mysql> select *, sum(c) from A group by b;
+------+------+------+--------+
| a    | b    | c    | sum(c) |
+------+------+------+--------+
|    0 |    0 |  1.1 |      9 |
|    0 |    1 |  1.4 |      9 |
|    0 |    2 |  1.7 |      9 |
+------+------+------+--------+
3 rows in set (0.00 sec)

сумма представляется суммой всех строк, а не суммой группировок

Есть идеи, почему я вижу это странное поведение?

Ответы [ 2 ]

4 голосов
/ 29 августа 2011

Здесь четко упоминается

В стандартном SQL запрос, включающий предложение GROUP BY, не может ссылаться на неагрегированные столбцы в списке выбора, которые не названы в Предложение GROUP BY. Например, этот запрос недопустим в стандартном SQL потому что имя столбца в списке выбора не отображается в GROUP BY:

SELECT o.custid, c.name, MAX(o.payment)
  FROM orders AS o, customers AS c
  WHERE o.custid = c.custid
  GROUP BY o.custid;

Чтобы запрос был законным, столбец имени должен быть опущен выберите список или имя в предложении GROUP BY.

MySQL расширяет использование GROUP BY, так что список выбора может ссылаться на неагрегированные столбцы, не указанные в предложении GROUP BY.

Ссылка:

http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html

http://explainextended.com/2011/03/30/mysql-group-by-in-union/

http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/

2 голосов
/ 29 августа 2011

Mysql - одна из немногих (есть ли другие?) Базы данных, которые допускают «недопустимый» SQL, например, где у вас есть group by без агрегатных функций для других выбранных столбцов.при ошибке возвращается строка первая , которая соответствует критериям, независимо от того, какое значение для сгруппированного по столбцу является.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...