2011-07-01 72 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)