nop*_*ole 1 mysql sql select group-by count
在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)
Run Code Online (Sandbox Code Playgroud)
以下是好的:
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)
Run Code Online (Sandbox Code Playgroud)
但是假设我们希望count(*)显示为第一列:
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
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误.为什么会如此,以及解决这个问题的方法是什么?
我意识到这没关系:
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)
Run Code Online (Sandbox Code Playgroud)
但是上面那个错误呢?谢谢.
我不确定它为什么会出错,但是如果你写的话:
SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent
Run Code Online (Sandbox Code Playgroud)
它不会给出错误.
即使没有该组,它也会失败并出现相同的错误:
SELECT whenSent, * FROM sentGifts
Run Code Online (Sandbox Code Playgroud)
根据文件:
在选择列表中使用不合格的*与其他项可能会产生解析错误.要避免此问题,请使用限定的tbl_name.*引用
所以我的猜测是,*如果出现不合格,必须紧跟在SELECT关键字之后.一般来说,你不应该这样做.它可能会停止在MySQL的更高版本中工作.
我还建议您在使用GROUP BY时阅读有关选择非聚合列的文档:
MySQL扩展了GROUP BY的使用,以便您可以在SELECT列表中使用未出现在GROUP BY子句中的非聚合列或计算
使用此功能时,每个组中的所有行应具有与GROUP BY部分中省略的列相同的值.服务器可以自由地从组中返回任何值,因此除非所有值都相同,否则结果是不确定的.
所以你的结果是不确定的.不要这样做.
选择*也是一种不好的做法.您应该明确列出所需的列,即使它们都是列.