PHP将嵌套查询的结果分配到数组中

时间:2012-07-09 20:58:18

标签: php mysql arrays temp-tables nested-query

我需要帮助才能将嵌套查询的结果分配到数组中。这是场景:

$Date_Collection = mysql_query("SELECT DISTINCT Date FROM TblDate");

while($date = mysql_fetch_array($Date_Collection)) // Loop through all the dates
{
    $var_date = $date['Date'];
    $result = mysql_query("select min(Speed) as Min_spd, max (Speed) as Max_spd, avg   
                  (Speed) as Avg_spd from ... where Date= $var_date");

  while($row = mysql_fetch_array($result))
   {
     echo "row[Min_spd]";
     echo "row[Max_spd]";
     echo "row[Avg_spd]";
    }
 }

此查询的输出如下:

Min_Spd |Max_Spd |Avg_Spd|       Date|
    12.0|    25.0|   20.4| 2012-10-01|
    11.0|    28.0|   21.4| 2012-10-02|
    10.0|    26.0|   23.4| 2012-10-05|
    08.0|    22.0|   21.4| 2012-10-08|

我基本上需要显示所有这些日期的Min_Spd,Max_spd之和,Avg_spd之和的总和。所以,我认为如果我可以将这些值分配到一个数组中,然后从数组中计算这些总和,那么这可能是一个好主意。

有人可以帮我解决这个问题吗?我可以使用数组来存储值,然后访问这些值并计算这些值的总和。如果我可以使用数组,有人可以告诉我在PHP中使用数组的语法。我真的很感激任何帮助。

是否有其他方法而不是使用数组,例如创建临时表来保存这些值,然后删除临时表。如果可以使用临时表,请你告诉我该怎么做。我可以将temptable用于单个循环,但是有一个嵌套循环,我不知道如何在嵌套循环中创建临时表来存储所有值。

4 个答案:

答案 0 :(得分:0)

$data = array();
while ($row = mysql_fetch_assoc($result)) {
    $data[] = $row;
}

然后你可以做

foreach($data as $row) {
   echo $row['Min_spd'];
   echo ...
   ...
}

答案 1 :(得分:0)

我不知道MySQL SUM函数是否可用于在te查询上执行此操作,请尝试使用它。但是在这个例子中,使用数组应该存储值,然后使用array_sum返回元素的总和。像这样:

$min_spd = array();
$max_spd = array();
$avg_spd = array();
while($row = mysql_fetch_assoc($result))
{
    $min_spd[] = $row['Min_spd'];
    $max_spd[] = $row['Max_spd'];
    $avg_spd[] = $row['Avg_spd'];
}

echo array_sum($min_spd);

也可以使用变量来存储和添加值:

$min_spd = 0;
$max_spd = 0;
$avg_spd = 0;

while($row = mysql_fetch_assoc($result))
{
    $min_spd += $row['Min_spd'];
    $max_spd += $row['Max_spd'];
    $avg_spd += $row['Avg_spd'];
}

echo $min_spd;

答案 2 :(得分:0)

我首先通过执行第一个查询来保存自己的嵌套查询:

$result = mysql_query("select Date, min(Speed) as Min_spd, max (Speed) as Max_spd, avg(Speed) as Avg_spd from ... group by Date")

然后在循环遍历每一行时为总和创建一个运行总计:

$sumMinSpeeds=0;
$sumMaxSpeeds=0;
$sumAvgSpeeds=0;
while($row = mysql_fetch_array($result))
{
    echo row['Min_spd'];
    echo row['Max_spd'];
    echo row['Avg_spd'];

    $sumMinSpeeds += $row['Min_spd'];
    $sumMinSpeeds += $row['Max_spd'];
    $sumMinSpeeds += $row['Avg_spd'];

}
echo $sumMinSpeeds;
echo $sumMaxSpeeds;
echo $sumAvgSpeeds;

答案 3 :(得分:0)

不要在循环中执行多个MySQL查询,而是考虑构建这样一个查询,它将返回您需要的所有结果。

<强> SQL

首先,使用GROUP SQL构造是有意义的。

SELECT
    s.Date       date,
    MIN(s.Speed) min,
    MAX(s.Speed) max,
    AVG(s.Speed) avg
FROM speed_table s
WHERE s.Date IN (SELECT DISTINCT d.Date FROM date_table d)
GROUP BY s.Date

了解此查询的每个部分的作用非常重要。如果您遇到任何问题,请咨询MySQL reference manual

<强> PHP

忘记使用mysql_*函数:它们是deprecated,并且出现了更好的实现:PDOmysqli。我的示例使用PDO

try {
    $dbh = new \PDO('mysql:dbname=my_db_name;host=127.0.0.1', 'dbuser', 'dbpass');
} catch (\PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$sql  = '...';  // This is the query
$stmt = $pdo->prepare($sql);
$stmt->execute();

您现在可以迭代返回的结果集

while ($row = $stmt->fetch()) {
    printf("%s; %s; %s; %s\n", $row['date'], $row['min'], $row['max'], $row['avg']);
}

或让Statement对象使用

返回整个数组
$result = $stmt->fetchAll(\PDO::FETCH_ASSOC);