3

古いスレッドを検索しましたが、次の問題の解決策をまだ見つけていません: ネストされたクエリに頼らずに mysql の結果をグループ化して配置することは可能ですか?

以下のサンプルをご覧ください。

私は持っている:

Month Jan, Location USA, Program DDD
Month Jan, Location UK, Program EEE
Month Jan, Location USA, Program LLL
Month FEB, Location UAE, Program EEE
Month FEB, Location USA, Program DDD
Month FEB, Location UK, Program MMM
Month MAR, Location USA, Program FFF
Month MAR, Location UAE, Program FFF
Month MAR, Location UK, Program FFF

私はそれらを次のように表示したい:

                +---------++---------++---------+
                |Month Jan||Month Feb||Month Mar|
+---------------+---------++---------++---------+
|Location USA   |         ||         ||         |
+---------------+---------++---------++---------+
|               |DDD      ||DDD      ||FFF      |
+---------------+---------++---------++---------+
|               |EEE      ||         ||         |
+---------------+---------++---------++---------+
|               |LLL      ||         ||         |
+---------------+---------++---------++---------+
|Location UK    |         ||         ||         |
+---------------+---------++---------++---------+
|               |EEE      ||MMM      ||FFF      |
+---------------+---------++---------++---------+
|Location UAE   |         ||         ||         |
+---------------+---------++---------++---------+
|               |         ||EEE      ||FFF      |
+---------------+---------++---------++---------+

クエリをグループ化しようとしましたが、HTML テーブルにレンダリングできません。

SELECT 
    event.`event_id`,
    event.`event_program_id`,
    event.`event_month`, 
    event.`event_location_id`,
    location.`location_name`,
    program.`program_name`,
    program.`program_shortname`
FROM 
    `event`
LEFT JOIN
    `location`
ON
    event.`event_location_id` = location.`location_id`
LEFT JOIN
    `program`
ON
    event.`event_program_id` = program.`program_id`;

現在、そのリストは次のようになっています。

    column1 column2 column3
line1   34              
line2   34              
line3           34  
line5       34          

私がこのようにしたかった場所:

    column1 column2 column3 
line1   34      34
                34      34
                34        

line2   34
        34      34      34              
line3           34      
line5       34          
4

1 に答える 1

3

予想される結果にあらかじめ定義された数の列がある場合は、列ごとにこれを達成するためにいくつかの内部クエリを実行できます。これは、月のようなものです。

このようなサブクエリを使用するSQLに基づくレポートの経験がありましたが、結局のところ、このソリューションは管理が面倒でした:)今日、データを読み取り、メモリ内のマトリックスに保存し、最後にマトリックスに基づいて結果を生成し、将来変更するのがはるかに簡単になります。

乾杯 !

ここにPHPの例があります

<pre>
<?php
$columns = array();
$data = array();

// add the data from the database
$data["line1"]["column1"] += 34;
$data["line2"]["column1"] += 34;
$data["line3"]["column4"] += 34;
$data["line5"]["column2"] += 34;

$data["line1"]["column1"] += 34;
$data["line3"]["column4"] += 34;

// find the columns
foreach ($data as $line => $column) {
    foreach ($column as $cname => $value) {
        if( ! in_array($cname, $columns) ){
            $columns[] = $cname;
        }
    }
}

sort($columns);

// display column names
echo " \t";
foreach ($columns as $index => $cname) {
    echo $cname . "\t";
}
echo "\n";

// display the data
foreach ($data as $line => $column) {
    echo $line . "\t";
    foreach ($columns as $index => $cname) {
        echo $column[$cname] . "\t";
    }
    echo "\n";
}
?>
</pre>

問題を解決する別の方法があります

<pre>
<?php
$columns = array();
$data = array();

// add the data from the database
// sort the data in the SQL
$data[] = array("l" => "line1", "c"=> "column1", "v" => "AAA");
$data[] = array("l" => "line1", "c"=> "column1", "v" => "BBB");
$data[] = array("l" => "line1", "c"=> "column3", "v" => "CCC");
$data[] = array("l" => "line2", "c"=> "column2", "v" => "AAA");
$data[] = array("l" => "line3", "c"=> "column2", "v" => "AAA");

// find the columns
foreach ($data as $line => $column) {
    if( ! in_array($column["c"], $columns) ){
        $columns[] = $column["c"];
    }
}

sort($columns);

// display column names
echo " \t";
foreach ($columns as $index => $cname) {
    echo $cname . "\t";
}
echo "\n";

$name = '';
$count = 0;
// display the data
foreach ($data as $line => $column) {
    if( $column['l'] == $name ){
        $count ++;
    } else {
        $name = $column['l'];
        $count = 0;
    }

    if( $count == 0 ){
        echo $name . "\t";
    } else {
        echo " \t";
    }   

    foreach ($columns as $index => $cname) {
        if( $column['c'] == $cname ){
            echo $column['v'] . "\t";       
        } else {
            echo " \t";
        }
    }
    echo "\n";
}
?>
</pre>

html を出力として使用するその他の参照

<table border="1">
<?php
$columns = array();
$data = array();

// add the data from the database
// sort the data in the SQL
$data[] = array("l" => "line1", "c"=> "column1", "v" => "AAA");
$data[] = array("l" => "line1", "c"=> "column1", "v" => "BBB");
$data[] = array("l" => "line1", "c"=> "column3", "v" => "CCC");
$data[] = array("l" => "line2", "c"=> "column2", "v" => "AAA");
$data[] = array("l" => "line3", "c"=> "column2", "v" => "AAA");

// find the columns
foreach ($data as $line => $column) {
    if( ! in_array($column["c"], $columns) ){
        $columns[] = $column["c"];
    }
}

sort($columns);

// display column names
echo "<tr>";
echo "<td>&nbsp;</td>";
foreach ($columns as $index => $cname) {
    echo "<td>".$cname."</td>";
}
echo "</tr>";

$name = '';
$count = 0;
// display the data
foreach ($data as $line => $column) {
    echo "<tr>";

    if( $column['l'] == $name ){
        $count ++;
    } else {
        $name = $column['l'];
        $count = 0;
    }

    if( $count == 0 ){
        echo "<td>".$name."</td>";
    } else {
        echo "<td>&nbsp;</td>";
    }   

    foreach ($columns as $index => $cname) {
        if( $column['c'] == $cname ){
            echo "<td>".$column['v']."</td>";
        } else {
            echo "<td>&nbsp;</td>";
        }
    }
    echo "</tr>";
}
?>
</table>
于 2013-02-18T09:59:36.020 に答える