В SQL почему «select *, count (*) из группы sentGifts by whenSent;» хорошо, но когда "*" и "count (*)" переключаются в положение, то это дает ошибку? - PullRequest
1 голос
/ 24 апреля 2010

В SQL, используя таблицу:

mysql>  select * from sentGifts;
+--------+------------+--------+------+---------------------+--------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID |
+--------+------------+--------+------+---------------------+--------+
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |
|      2 | 2010-04-24 |    123 | 4568 | 2010-04-24 01:56:04 |    100 |
|      3 | 2010-04-24 |    123 | NULL | NULL                |      1 |
|      4 | 2010-04-24 |   NULL |  111 | 2010-04-24 03:10:42 |      2 |
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |
|      6 | 2010-04-24 |     11 |  222 | 2010-04-24 03:54:49 |      6 |
|      7 | 2010-04-24 |      1 |    2 | 2010-04-24 03:58:45 |      6 |
+--------+------------+--------+------+---------------------+--------+
7 rows in set (0.00 sec)

Все в порядке:

mysql>  select *, count(*) from sentGifts group by whenSent;
+--------+------------+--------+------+---------------------+--------+----------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID | count(*) |
+--------+------------+--------+------+---------------------+--------+----------+
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |        1 |
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |        6 |
+--------+------------+--------+------+---------------------+--------+----------+
2 rows in set (0.00 sec)

Но предположим, что мы хотим, чтобы счетчик (*) отображался в первом столбце:

mysql>  select count(*), * from sentGifts group by whenSent;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from sentGifts group by whenSent' at line 1

выдает ошибку. Почему так и как это исправить?

Я понял, что это нормально:

mysql>  select count(*), whenSent from sentGifts group by whenSent;
+----------+------------+
| count(*) | whenSent   |
+----------+------------+
|        1 | 2010-03-03 |
|        6 | 2010-04-24 |
+----------+------------+
2 rows in set (0.00 sec)

а как быть с приведенным выше сообщением об ошибке? спасибо.

Ответы [ 2 ]

5 голосов
/ 24 апреля 2010

Я не уверен, почему выдает ошибку, но если вы напишите:

 SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent

это не дает этой ошибки.

Также происходит сбой с той же ошибкой даже без группы:

 SELECT whenSent, * FROM sentGifts 

Согласно документации :

Использование неквалифицированного * с другими элементами в списке выбора может привести к ошибке разбора. Чтобы избежать этой проблемы, используйте квалифицированное имя_таблицы. * Ссылка

Так что я предполагаю, что неквалифицированный *, если он появляется, должен быть сразу после ключевого слова SELECT. В общем, вы не должны этого делать. Он может перестать работать в более поздних версиях MySQL.

Я также предлагаю вам прочитать документацию относительно выбора неагрегированных столбцов при использовании GROUP BY:

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

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

Так что ваши результаты неопределенны. Не делай этого.

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

3 голосов
/ 24 апреля 2010

Из справочного руководства MySQL:

Использование неквалифицированных * с другими элементы в списке выбора могут производить ошибка разбора. Чтобы избежать этой проблемы, используйте полное имя tbl_name. * ссылка.

Так что вместо:

SELECT count(*), * FROM sentGifts GROUP BY whenSent

Используйте

SELECT count(*), sentGifts.* FROM sentGifts GROUP BY whenSent

Или

SELECT count(*), sg.* FROM sentGifts as sg GROUP BY whenSent
...