2013-02-18 4 views
3

Я искал более старые темы, но еще не нашел решения для следующей проблемы: возможно ли группировать и упорядочивать результаты mysql, не прибегая к вложенным запросам?Запрос группы 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   

ответ

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> 
+1

Некоторые примеры могли бы мне помочь понять лучше;) –

+0

добавить пример;) повеселиться !! в примере я добавляю только 1 уровень, но вы можете добавить столько, сколько вам нужно, просто добавив больше измерений в массив $ data –

+1

Вау, это не пример, это идеальное решение, на которое я верю;). –

Смежные вопросы