我正在开发一个使用其他程序员编写的MySQL查询的系统,并正在调整他的代码。
我有三个问题:
1
其中一个查询有这个select语句:
SELECT
[...]
AVG(mytable.foo, 1) AS 'myaverage'`,
AVG(mytable.foo, 1) AS 'myaverage'
中的1是否合法?我找不到支持其用法的文档?
2
这样的结果给出了平均值到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)
感谢。
答案 0 :(得分:1)
关于你的上一个问题:你能发布你正在使用的确切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)
答案 1 :(得分:0)
1。 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 1
http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_avg
仅仅因为我很好奇 - 第二个论点应该怎么做?
答案 2 :(得分:0)
对于任何有兴趣的人,我必须删除或更改我的前任代码,因此这个AVG
问题不正确。正确的代码是ROUND(AVG(myaverage),1)
。向那些因我的愚蠢而低头的人道歉。