使用嵌套格式的组Mysql查询

问题描述 投票:3回答:1

我搜索了较旧的线程但尚未找到解决以下问题的方法:是否可以分组和排列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          
php mysql html-table cross-reference
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>
© www.soinside.com 2019 - 2024. All rights reserved.