2011-07-01 70 views
4

我正在开发一个系统,使用其他程序员编写的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?

或者,有没有一种方法可以说明myaverage应该是一个整数,当我在AS语句中命名它时?

喜欢的东西:

SELECT 
    AVG(myaverage) AS `myaverage`, INT(10) 

感谢。

+0

9.3 <11.1如何显示它被存储为一个字符串?通常它是“11.1”<“9.3”但是9.3 <11.1 – 2011-07-01 20:21:03

+1

将这个问题分解成*不同的SO帖子可能会更好。第一次关注#1 /#2,第二次关注#3。欢迎来到SO。问题2的 – 2011-07-01 20:23:54

+0

:“在MySQL 5.0.3之前,SUM()和AVG()为所有数字参数返回DOUBLE。” – Sinan

回答

0

只是任何人谁是有兴趣的,我必须删除或更改我的前辈代码,所以这个问题AVG是不正确的。正确的代码是ROUND(AVG(myaverage),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

只是因为我很好奇 - 我应该第二个参数呢?

+0

我从AVG('mytable'.'foo',1)'没有得到任何错误。我不确定第二个参数应该做什么,它是我之前的遗留代码。 – user783322

+0

可能取决于版本,您使用哪一个?我试着用5.1.41 – wonk0

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)