2013-02-18 4 views
3

J'ai recherché dans des threads plus anciens mais je n'ai pas encore trouvé de solution au problème suivant: est-il possible de grouper et d'organiser des résultats mysql sans recourir à des requêtes imbriquées?Requête de groupe mysql avec format imbriqué

Veuillez voir l'exemple ci-dessous.

J'ai:

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 

Je veux qu'ils affichent comme ceci:

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

J'ai essayé grouper la requête, mais je suis incapable de le rendre à la table 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`; 

En ce moment son inscription comme ceci:

column1 column2 column3 
line1 34    
line2 34    
line3   34 
line5  34   

Là où je voulais comme ceci:

column1 column2 column3 
line1 34  34 
       34  34 
       34   

line2 34 
     34  34  34    
line3   34  
line5  34   

Répondre

3

Vous pouvez faire des requêtes internes pour réaliser cette opération pour chaque colonne, si vous avez un nombre prédéfini de colonnes dans le résultat attendu, quelque chose comme juste les mois de l'année. J'ai eu une certaine expérience avec des rapports basés sur SQL qui ont utilisé des sous-requêtes comme ça, en fin de compte, cette solution était difficile à gérer :) aujourd'hui, je viens de lire les données, stocker dans une matrice en mémoire et à la fin générer le résultat basé sur la matrice, beaucoup plus facile de changer à l'avenir.

bravo!

ici est un exemple en 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> 

Voici une autre façon de résoudre le problème

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

autre référence en utilisant html comme sortie

<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

Quelques exemples pourraient me aider à le comprendre mieux;) –

+0

ajouter l'exemple;) amusez-vous !! dans l'exemple, j'ajoute seulement 1 niveau, mais vous pouvez en ajouter autant que vous le souhaitez simplement en ajoutant plus de dimensions au tableau de données $ –

+1

Wow c'est pas un exemple, c'est une solution parfaite je crois;). –