2010-10-08 232 views
10

我目前使用下面的查詢得到一些數字:MySQL中的加權平均計算?

SELECT gid, count(gid), (SELECT cou FROM size WHERE gid = infor.gid)  
FROM infor 
WHERE id==4325 
GROUP BY gid; 

我在我的當前階段得到的輸出如下:

+----------+-----------------+---------------------------------------------------------------+ 
| gid  | count(gid)  | (SELECT gid FROM size WHERE gid=infor.gid)     | 
+----------+-----------------+---------------------------------------------------------------+ 
|  19 |    1 |               19 | 
|  27 |    4 |               27 | 
|  556 |    1 |               556 | 
+----------+-----------------+---------------------------------------------------------------+ 

我試圖計算加權平均值,即

(1 * 19 + 4 * 27 + 1 * 556)/(19 + 27 + 556)

有沒有辦法使用單個查詢來做到這一點?

回答

13

用途:

SELECT SUM(x.num * x.gid)/SUM(x.cou) 
    FROM (SELECT i.gid, 
       COUNT(i.gid) AS num, 
       s.cou 
      FROM infor i 
    LEFT JOIN SIZE s ON s.gid = i.gid 
     WHERE i.id = 4325 
     GROUP BY i.gid) x 
+0

太棒了...非常感謝您的支持。我正要在一個過程中編寫一個嵌套循環,但接着發現一篇文章說:「如果你需要一個嵌套循環,那麼你沒有看JOIN」:) – Legend 2010-10-08 02:32:59

+0

@legend:建議是正確的,但JOIN也是如果有多個孩子與父母相關聯,則可能存在風險膨脹記錄。如果你想要父項的不同行,最好使用子查詢(EXISTS將是我的建議)。 – 2010-10-08 02:35:28

+0

我明白了。在我的情況下,只有一個元素,但我會記住你的建議。 – Legend 2010-10-08 02:45:10

1

您可以將原始查詢作爲子查詢並SUM記錄。我無法測試這個,因爲我沒有你做的數據集,但它應該在理論工作;)

SELECT SUM(gid)/SUM(weights) AS calculated_average FROM (
    SELECT gid, (COUNT(gid) * gid) AS weights 
    FROM infor 
    WHERE id = 4325 
    GROUP BY gid); 
+0

+1這種方法。謝謝。只是想知道哪一個更有效率。會跑到'EXPLAIN'看看。 – Legend 2010-10-08 02:33:44

+0

@傳奇,沒問題。你可能實際上需要'JOIN',但是從OP中,我沒有看到它的必要性。 – 2010-10-08 02:37:25