在SQL中,为什么是;按whenSent从sentGifts组中选择*,计数(*)&引用;好的,但是什么时候*&引用;及;计数(*)";是切换位置,那么它给出了一个错误?
在SQL中,使用表:在SQL中,为什么是;按whenSent从sentGifts组中选择*,计数(*)&引用;好的,但是什么时候*&引用;及;计数(*)";是切换位置,那么它给出了一个错误?,sql,mysql,select,count,group-by,Sql,Mysql,Select,Count,Group By,在SQL中,使用表: mysql> select * from sentGifts; +--------+------------+--------+------+---------------------+--------+ | sentID | whenSent | fromID | toID | trytryWhen | giftID | +--------+------------+--------+------+---------------------+
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)
但假设我们希望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
它给出了一个错误。为什么会这样?有什么办法可以解决
我意识到这没关系:
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)
但是上面那个错误的呢?谢谢。我不知道为什么会出现错误,但如果您写:
SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent
它没有给出那个错误
此外,即使没有组,它也会因相同的错误而失败:
SELECT whenSent, * FROM sentGifts
根据报告:
将非限定*与选择列表中的其他项一起使用可能会产生分析错误。为避免此问题,请使用限定的tbl_名称。*引用
因此,我的猜测是,如果出现非限定的*
,则它必须紧跟在SELECT关键字之后。一般来说,你不应该这样做。它可能会在MySQL的更高版本中停止工作
我还建议您阅读关于在使用GROUP BY时选择非聚集列的说明:
MySQL扩展了GROUP BY的使用,因此您可以在SELECT列表中使用GROUP BY子句中未出现的非聚集列或计算
使用此功能时,每个组中的所有行对于按部分从组中写入的列应具有相同的值。服务器可以从组中自由返回任何值,因此结果是不确定的,除非所有值都相同
所以你的结果是不确定的。不要这样做
选择
*
也是一种不好的做法。您应该明确列出所需的列,即使它是所有列。我不知道为什么会出现错误,但如果您写:
SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent
它没有给出那个错误
此外,即使没有组,它也会因相同的错误而失败:
SELECT whenSent, * FROM sentGifts
根据报告:
将非限定*与选择列表中的其他项一起使用可能会产生分析错误。为避免此问题,请使用限定的tbl_名称。*引用
因此,我的猜测是,如果出现非限定的*
,则它必须紧跟在SELECT关键字之后。一般来说,你不应该这样做。它可能会在MySQL的更高版本中停止工作
我还建议您阅读关于在使用GROUP BY时选择非聚集列的说明:
MySQL扩展了GROUP BY的使用,因此您可以在SELECT列表中使用GROUP BY子句中未出现的非聚集列或计算
使用此功能时,每个组中的所有行对于按部分从组中写入的列应具有相同的值。服务器可以从组中自由返回任何值,因此结果是不确定的,除非所有值都相同
所以你的结果是不确定的。不要这样做
选择
*
也是一种不好的做法。您应该明确列出所需的列,即使它是所有列。来自MySQL参考手册:
将不合格*与其他
选择列表中的项目可能会产生
分析错误。为了避免这个问题,,
使用限定的tbl_名称。*引用
因此,不是:
SELECT count(*), * FROM sentGifts GROUP BY whenSent
使用
或
从MySQL参考手册: 将不合格*与其他 选择列表中的项目可能会产生 分析错误。为了避免这个问题,, 使用限定的tbl_名称。*引用 因此,不是:
SELECT count(*), * FROM sentGifts GROUP BY whenSent
使用
或
+是的,我认为这是对他的问题最直接的回答。