2011-10-13 4 views
3

Ok, donc je sais que je pourrais obtenir alésé même pour suggérer une telle chose, mais il m'a curieux ...MySQL: LEFT JOIN ou UNION table et définir la valeur de colonne comme nom de colonne?

Supposons que j'ai une table comme:

content 
--------------- 
| id | status | 

et une table comme celui-ci :

attributes 
--------------------------- 
| id | pid | name | value | 

où certains attributs pourraient être

| 1 | 1 | status | published | 
| 2 | 1 | viable | yes  | 

Est-il possible de faire une requête afin que la valeur de la colonne NAME des attributs soit représentée comme un nom de colonne?

Exemple:

SELECT a.name AS {a.name value} FROM content c LEFT JOIN attributes a ON a.pid = c.id 

Alors, quand je lance à travers les résultats que je pouvais faire quelque chose comme

foreach($result as $r){ 
    echo $r->viable; //yes 
    echo $r->status; //published 
} 

Je sais que cela ne suit pas databasing relationnelle, mais il serait utile de moi quelques attributs superflus. L'autre option à laquelle je pensais était de stocker les données sous la forme d'une chaîne sérialisée, mais cela me fait grincer des dents.

+0

Connaissez-vous tous les noms à utiliser comme des colonnes à l'avance, ou sont-ils dynamiques? –

+1

Ce que vous demandez est appelé un "tableau croisé dynamique" http://stackoverflow.com/search?q=mysql+pivot+table http://stackoverflow.com/search?q=%5Bmysql%5D+rows+ aux colonnes + –

+0

Elles sont dynamiques, donc je n'ai pas de liste de ce qu'elles seraient à l'avance. –

Répondre

2

MySQL ne prend pas en charge les requêtes pivot natives, et il ne peut pas faire pivoter un nombre arbitraire de lignes dans les colonnes, car les colonnes doivent être connues à l'avance. En d'autres termes, vous devez le faire avec PHP. Je ne suis pas sûr si plusieurs objets peuvent être retournés de votre requête ou pas (chaque objet devrait être une seule ligne, mais vous avez déjà admis un manque de normalisation). Si seulement un seul doit être retourné à chaque fois, c'est encore plus simple. Cependant, je vais supposer que plus d'un peuvent être retournés et ils sont calées sur pid:

$content = array(); 
while ($row = $result->fetch()) { 
    //Prevent a PHP warning; this step can be skipped 
    if (!isset($content[$row->pid])) { 
     $content[$row->pid] = array(); 
    } 

    $content[$row->pid][$row->name] = $row->value; 
} 
+0

lame. Pas votre réponse, mais cela pourrait être très utile. Je suppose que je vais le faire avec PHP. Merci. –

Questions connexes