是否施放?

时间:2011-07-01 20:17:12

标签: mysql

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

感谢。

3 个答案:

答案 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)。向那些因我的愚蠢而低头的人道歉。

相关问题