PHP / MySQL平均值基于Array的内容

时间:2014-07-03 10:33:27

标签: php mysql arrays

我有以下数组:

array(
    a => 6.75,
    b => 5.45,
    c => 8.76,
    d => 7.76,
    e => 8.16,
    f => 2.76,
    g => 4.67,
    h => 9.01,
    i => 5.42,
)

我希望实现的目标是average top quartile

本质上我需要按descending顺序对数组进行排序,然后计算top quartile将是什么(即9(数组中的元素数)x 25%= 2.25向下舍入到2,所以它是前两个需要平均的数字。)

这是我正在寻找的这个数字。

我正在努力弄清楚如何实现这一目标以及最好是在PHP中执行此操作还是通过查询MySQL数据库。

欢迎任何建议,反馈和建议。

5 个答案:

答案 0 :(得分:2)

在MySQL中执行此操作会很困难,因为您不能直接使用变量LIMIT

然而,在那里进行它肯定是最有效的,而不是在你只需要一点时将所有数据传输到PHP。

因此,考虑到这一点,请尝试此算法:

    从您的表中
  • SELECT COUNT(*)获取行数
  • 将该行数除以4,调用$quartile_count
  • 现在您需要一个嵌套查询:

    SELECT AVG(`column_name`)
    FROM (
        SELECT `column_name`
        FROM `table_name`
        ORDER BY `column_name` DESC
        LIMIT $quartile_count
    ) `tmp`
    

    这是因为LIMIT必须首先应用于汇总AVG功能之前。

答案 1 :(得分:1)

$a = array(
    'a' => 6.75,
    'b' => 5.45,
    'c' => 8.76,
    'd' => 7.76,
    'e' => 8.16,
    'f' => 2.76,
    'g' => 4.67,
    'h' => 9.01,
    'i' => 5.42,
);
rsort($a);
$sum = 0;
for($i = 0; $i < count($a) / 4; ++$i){
    $sum += $a[$i];
}
$result = $sum / $i;
echo $result;

答案 2 :(得分:1)

您可以在PHP中轻松完成此操作:

$array = array(
a => 6.75,
b => 5.45,
c => 8.76,
d => 7.76,
e => 8.16,
f => 2.76,
g => 4.67,
h => 9.01,
i => 5.42,
);

arsort($array); // Order the array in descending order
$top_quartile = floor(count($array)/4); // Calculate top quartile
$array = array_slice($array, 0, $top_quartile); // Keep only the top quartile values

$total = 0;
foreach($array as $value) {
    $total += $value;
}
$average = $total/$top_quartile;

echo $average;

答案 3 :(得分:1)

完成一个SQL: -

SELECT AVG(some_column)
FROM
(
    SELECT some_column, @seq:=@seq+1 AS seq
    FROM
    (
        SELECT some_column
        FROM some_values
        ORDER BY some_column DESC
    ) sub0
    CROSS JOIN (SELECT @seq:=0) sub1
) sub2
CROSS JOIN
(
    SELECT COUNT(*) AS all_count
    FROM some_values
) sub3
WHERE sub3.all_count / 4 > sub2.seq

这有一个子查询以降序获取行,然后向其添加序列号,然后将其结果与获取记录总数的子查询交叉连接,具有WHERE子句以消除所有但是前四分之一然后使用AVG()来获得平均值。

更多的是出于兴趣,而不是作为一个实际的解决方案,因为我怀疑它会表现不佳。只有在需要它作为必须是单个查询的数据源时才真正有用。

答案 4 :(得分:0)

这是您问题的完整代码。

$rs = mysql_query("select count(column name) as total from table");
$result = mysql_fetch_row($rs);
$avg = floor($result[0]/4);

$rs = mysql_query("select column name from table order by column name desc limit 0,".$avg);
$total = 0;
while($result = mysql_fetch_array($rs))
{
     $total += $result['column name'];
}
echo $total/mysql_num_rows($rs);