加权意味着MySQL和/或PHP

时间:2015-07-10 14:31:16

标签: php mysql

我有一个数据库:

id     apple    orange    p      q
1      3        2         0      1
2      4        1         1      1
3      2        2         0      0

我想计算水果列的平均值,每个值都用该行中p + q的总和加权。

mean_of_apple
= ( 3 + 4 + 2) / 3
= 3

weighted_mean_of_apple =
= ( (3 * (0 + 1)) + (4 * (1 + 1)) + (2 * (0 + 0)) ) / ( (0 + 1) + (1 + 1) + (0 + 0) )
= 3.6667

通常,为了获得每列的算术平均值,我会做类似的事情:

SELECT AVG(apple), AVG(orange) FROM my_table

如何在没有复杂循环和存储中间结果的情况下获得加权平均值?

我使用PHP查询数据库,因此可以使用MySQL,PHP或两者的组合来计算均值。

我有这个:

$query = "SELECT * FROM fruits";
// ...
// PHP queries the database and gets the results
// ...
$apple = array();
$orange = array();
while($row = $result->fetch_assoc()) {
    for($i = 0; $i < ($row["ch1"] + $row["ch2"]); $i++) {
        $apple[] = $row["apple"];
        $orange[] = $row["orange"];
    }
}
$mean_apple = array_sum($apple) / count($apple);
$mean_orange = array_sum($orange) / count($orange);

但我想知道,如果有更好的方法 - 如果这是更正确的话。

请注意,真正的桌子有五个水果和四个重量,如果这对你的答案产生影响。

1 个答案:

答案 0 :(得分:2)

您可以使用以下查询执行此操作:

SELECT AVG(apple) AS appleAvg, 
       SUM(apple * (p+ q)) / SUM(p + q) AS wAppleAvg,
       AVG(orange) AS orangeAvg,
       SUM(orange * (p + q)) / SUM(p + q) AS wOrangeAvg
FROM mytable

Demo here