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 セルの最大値を持つ行と同じでなければなりません
  • 合計値は常に同じです。

出力テーブルには、このようなグループ化が複数発生します。私は自分の質問をグーグルで検索しようとしましたが、私が探していたものに最も近いのはこれでした: jQuery を使用してテーブルの真ん中に行を追加する方法は? これは私が実際に行っていることではありません。

それを行うために使用できるSQLコマンドがあるかどうか、またはphpまたはjqueryを使用して実行できるかどうかはわかりません。任意の提案をいただければ幸いです。

ありがとうございました!

アップデート:

SQL で GROUP BY を使用しようとしましたが、構文エラーが発生します。

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

(WHEREを気にしないでください...実際にそこにステートメントがあります)。実際にクエリをグループ化したのは、クエリに 2 つまたは 3 つの結果があり、3 つすべてが同じ名前である場合だけです。したがって、GROUP BYはオプションではありません。

PHPでは、名前を変数に保存し、名前が同じかどうかを確認しています。同じでない場合はマスタークラスを行に追加し、そうでない場合はクラスが子であるため、グループ化に役立ちます。ただし、上に要約行を追加する方法がわかりませんでした。

名前が変更されるたびに空白行が追加され、ページが読み込まれた後に jquery を使用してデータが入力されると考えていましたが、名前が 1 回だけ出現する場合は要約は必要ありません。

要約行の Val3 については、上記の変更を加えました。Val3 は、実行値が最大の行の val3 と同じになります。私は自分の例に混乱していたと思います。

この情報がより役立つことを願っています。

4

1 に答える 1

0

このようなことをしなければならないときはいつでも、多次元の連想配列を使用し、トップレベルのキーをグループ化の最高レベルにします。あなたの場合、それは「名前」になります。

その配列の各要素には、追跡したい各値のキーを持つ別の連想配列があります。そのグループに属する個々の行を含む番号付きのサブ配列もあります。

すべての行を調べ終わったら、結果の連想配列を調べて、結果を出力します。

例えば:

<?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>";
}

?>

このコードはテスト済みです

于 2013-06-27T21:16:22.393 に答える