我正在开发一个使用另一位程序员编写的MySQL查询的系统,并且正在调整他的代码。
我有三个问题:
1.
其中一个查询包含以下select语句:
SELECT
[...]
AVG(mytable.foo, 1) AS 'myaverage'`, AVG(mytable.foo, 1) AS 'myaverage'中的%1合法吗?我找不到文档来支持它的用法?
2.
这个结果给出了小数点后两位的平均值,为什么?
3.
我正在使用它来创建一个临时表。所以:
(SELECT
[...]
AVG(`mytable`.`foo`, 1) AS `myaverage`,
FROM
[...]
WHERE
[...]
GROUP BY
[...])
UNION
(SELECT
[...]
FROM
[...]
WHERE
[...]
GROUP BY
[...])
) AS `tmptable`
ORDER BY
`tmptable`.`myaverage` DESC当我按照这一列对表进行排序时,我得到的输出表明这个平均值是以字符串的形式存储的,所以结果如下:
9.3
11.1
为了解决这个问题,我应该使用什么?
我应该使用CAST还是CONVERT,像DECIMAL (我读取的基本上是二进制),BINARY本身,或者UNSIGNED?
或者,当我在AS语句中命名myaverage时,有没有办法说明它应该是一个整数?
类似于:
SELECT
AVG(myaverage) AS `myaverage`, INT(10)谢谢。
发布于 2011-07-19 00:07:53
对于感兴趣的人来说,我一定是删除或更改了以前的代码,所以这个AVG问题是不正确的。正确的代码是ROUND(AVG(myaverage),1)。我要向那些对我的愚蠢大加指责的人道歉。
发布于 2011-07-13 04:42:10
关于你的最后一个问题:你能准确地发布你正在使用的MySQL查询吗?
UNION中列的结果类型由您返回的所有内容决定。参见http://dev.mysql.com/doc/refman/5.0/en/union.html。
因此,即使您的AVG()函数返回一个DOUBLE,UNION的其他部分仍然可能返回一个字符串。在这种情况下,结果的列类型将是字符串。
请参见以下示例:
mysql> select a from (select 19 as a union select '120') c order by a;
+-----+
| a |
+-----+
| 120 |
| 19 |
+-----+
2 rows in set (0.00 sec)
mysql> select a from (select 19 as a union select 120) c order by a;
+-----+
| a |
+-----+
| 19 |
| 120 |
+-----+
2 rows in set (0.00 sec)发布于 2011-07-02 05:15:47
On1.avg()只接受一个参数,否则MySQL会抛出一个错误:
mysql> SELECT AVG( id, 1 ) FROM anytable;
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 ' 1 )' at line 1http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_avg
仅仅因为我很好奇-第二个参数应该做什么?
https://stackoverflow.com/questions/6552820
复制相似问题