2009-11-23 9 views
2

J'ai plusieurs à plusieurs table MySQL - il peut ressembler à:MySQL plusieurs à plusieurs table matrice de table

A | B 
1 | 1 
1 | 2 
1 | 3 
3 | 4 
3 | 5 
4 | 1 
4 | 2 
4 | 5 

etc.

Vous remarquerez que les chiffres ne sont pas toujours contiguë, (A = 1,3,4 ..) - Je cherche le moyen le plus rapide de transformer cela en une table de matrice, en ignorant les colonnes et les lignes sans données (par exemple A = 2). Ce que je travaille est douloureusement lent que je prends chaque ligne dans un tableau séparé en php, en passant par une imbriqué en boucle, où il vérifie si la clé pour le tableau A et tableau B correspondance l'indice actuel:

while ($i <= $max_A) { 
    if (in_array($i, $array_A)) { 
     print ("<tr>"); 

     while ($j <= $max_B) { 
      if (in_array($j, $array_B)) { 
       print ("<td>"); 
       if (in_matrix($i, $j, $array_A, $array_B)) { 
        print ("1"); 
       } else { 
        print ("0"); 
       } 
       print ("</td>"); 
      } 
      $j++; 
     } 
     print ("</tr>\n"); 
     $j = $min_B; 
    } 
    $i++; 
} 

function in_matrix($search_value_A, $search_value_B, $array_A, $array_B) { 
    // Store the array keys matching search 
    $keys_A = array_keys($array_A, $search_value_A); 
    $keys_B = array_keys($array_B, $search_value_B); 
    foreach ($keys_A as $value) { 
     if (in_array($value, $keys_B)) { 
      return true; 
     } 
    } 
    return false; 
} 

Peut-être y at-il plus de choses que je peux faire MySQL ou accélérer la recherche - J'ai essayé de trouver un moyen de rechercher un tableau bidimensionnel (par exemple retourner la colonne A = x ET la colonne B = y).

Merci

+0

Quels sont '$ i' et' $ j' avant que vos boucles 'while' ne commencent? –

Répondre

3

Il est appelé pivoter les données quand il est fait dans SQL, parce que vous changez la ligne en données colonnaire:

SELECT t.a, 
      MAX(CASE WHEN t.b = 1 THEN 'x' ELSE NULL END), 
      MAX(CASE WHEN t.b = 2 THEN 'x' ELSE NULL END), 
      MAX(CASE WHEN t.b = 3 THEN 'x' ELSE NULL END), 
      MAX(CASE WHEN t.b = 4 THEN 'x' ELSE NULL END), 
      MAX(CASE WHEN t.b = 5 THEN 'x' ELSE NULL END), 
    FROM TABLE t 
GROUP BY t.a 

L'instruction CASE est une structure similaire à une instruction switch, mais ne supporte pas tomber à travers. Vous devrez définir une instruction CASE pour chaque valeur de ligne que vous souhaitez afficher en tant que colonne.

Questions connexes