2013-06-27 25 views
0

我有一个sql查询,输出大量的信息。我需要做的是分组并汇总输出表中的信息。这里是我想要做的一个例子:如何分组表格行并在组上方添加汇总行?

name  val1 val2 val3 total Run 
some name 18  4  1  23  
some name 5  4  1  23  2 
some name 13  8  2  23  1 
other name 2  2  0  4  1 
and name  2  42  1  45  1 

是来自数据库中的名字可以出现更多然后一次。如果是这样我组的项目一起,并添加摘要行上方将具有相同的名称,但也计算总计:

  • VAL1有加在一起
  • VAL2,VAL3必须是相同的在RUN单元中具有最大值的行
  • 总值始终保持不变。

在输出表中会出现多次这样的分组。 我试图谷歌我的问题,但最接近,我得到了我所寻找的是这样的:How to add rows in middle of a table with jQuery? 这不是我真的在做什么。

我不知道是否有一个sql命令可以用来做到这一点,或者如果它可以在PHP或使用jQuery的。任何建议将不胜感激。

谢谢!

更新:

我已经在SQL中使用GROUP BY试过了,但它给了我语法错误:

SELECT name, val1, val2, val2, run 
FROM tableName 
WHERE ... ORDER BY name DESC GROUP BY name 

(不介意WHERE ...其实我有报表存在)。 当查询中有两个或三个结果并且所有三个结果都具有相同名称时,它实际上将查询分组的唯一时间。所以我虽然GROUP BY不是选项。

在PHP中,我将名称存储到变量中,并检查名称是否相同。如果它不是相同的我添加大师班的行,如果不是类是孩子,这有助于我分组。但是我没有想出一种方法来添加上面的汇总行。

我一直在想,每当名称发生变化时,添加一个空白行并使用jquery在页面加载后填充它,但是,一次名称的发生我不需要总结。

至于在总结行中的Val3,我已经在上面进行了更改。 Val3将与具有最大运行值的行中的val3相同。我想我被我自己的例子弄糊涂了。

我希望这些信息更有帮助。

+0

这一切都很好 - 但你尝试过什么解决比谷歌它的其他问题了吗?你有开始开发的SQL,PHP或JQuery,但后来被卡住了?向我们展示一些东西,帮助你会更容易。 – 2013-06-27 18:22:33

+0

我可以理解你对val1和val2的意思,但我不明白val3。你在减去什么,你从中减去了什么? – wwv

+0

感谢您的评论,我已添加上述更改。 – Hesh

回答

0

无论何时我需要做这样的事情,我都会使用多维关联数组,顶级键是我想要做的最高级别的分组。在你的情况下,这将是“名称”。

在该数组的每个元素中,还有另一个assoc数组,每个值都需要跟踪一个值。还有一个编号的子数组,它将包含属于该组的每个单独的行。

在我完成所有行的检查之后,我会遍历所生成的关联数组并打印结果。

例如:

<?php 

/** Simulate of the results of your SQL query **/ 
$sql_result = array(
    array("name"=>"some name ", "val1"=>5, "val2"=>4, "val3"=>1, "run" =>2), 
    array("name"=>"some name ", "val1"=>13, "val2"=>8, "val3"=>2, "run" =>1), 
    array("name"=>"other name", "val1"=>2, "val2"=>2, "val3"=>0, "run" =>1), 
    array("name"=>"and name", "val1"=>2, "val2"=>42, "val3"=>1, "run" =>1) 
); 

/** Add each result to your assoc array **/ 
$names = array(); 
foreach($sql_result as $row) { 
    $name = $row["name"]; 

    // Create a new assoc array for each different name 
    if(!$names[$name]) { 
     $names[ $name ] = array(
      "name"  => $row["name"], 
      "max_run" => $row["run"], 
      "val1"  => $row["val1"], 
      "val2"  => $row["val2"], 
      "val3"  => $row["val3"], 
      "runs"  => array($row) 
     ); 
     continue; 
    } 

    // Update the necessary values for the highest "run" number 
    if ($row["run"] > $names[ $name ]["max_run"]) { 
     $names[ $name ]["max_run"] = $row["run"]; 
     $names[ $name ]["val2"] = $row["val2"]; 
     $names[ $name ]["val3"] = $row["val3"]; 
    } 

    // Update the reset of the values 
    $names[ $name ]["val1"]  += $row["val1"]; 
    $names[ $name ]["total"] = $names[ $name ]["val1"] + $names[ $name ]["val2"] + $names[ $name ]["val3"]; 
    $names[ $name ]["runs"][] = $row; 

} 

/** Print your results **/ 
foreach ($names as $name) { 
    // Print your totals here like $name["total"], $name["val1"] 
    echo $name["name"]." "; 
    echo $name["val1"]." "; 
    echo $name["val2"]." "; 
    echo $name["val3"]." "; 
    echo $name["total"]."<br>"; 
    if (count($name["runs"]) > 1) { 
     foreach($name["runs"] as $run) { 
      echo print_r($run)."<br>"; 
     } 
    } 
    echo "<hr>"; 
} 

?> 

此代码测试

+0

谢谢JJS,这是一个很好的方法。我正在考虑将它存储到数组中,但不想占用额外的内存,因为通常我会至少有100个查询结果。你认为有一种方法可以避免数组吗?如果没有,我会继续这个实现 – Hesh

+0

有人比我更聪明可能会发布一些东西,但我能想到的唯一的其他方式是SQL中的一些子查询。 assoc数组方法是我使用很多的方法,即使waaay超过100个结果,我也没有遇到任何问题。 – wwv

+0

非常感谢您的帮助。对此,我真的非常感激!再次感谢! – Hesh