我有一个输出大量信息的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
从数据库进入的名称可能会出现一次以上。如果是的话,我将这些项目组合在一起并添加上面的摘要行,该行具有相同的名称,但也计算总数:
输出表中会出现多次此类分组。 我试着谷歌我的问题,但最接近我所寻找的是这个: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 :(得分: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>";
}
?>
此代码经过测试