Transposer une rangée en colonnes avec MySQL sans utiliser SYNDICATS?
Question
J'ai une table qui est similaire à ce qui suit ci-dessous:
id | cat | one_above | top_level |
0 'printers' 'hardware' 'computers'
Je veux être en mesure d'écrire une requête, sans utiliser les syndicats , qui me retourner un jeu de résultats que les colonnes de transpose ce tableau en lignes. Ce que cela signifie, est que je veux que le résultat soit:
id | cat |
0 'printers'
0 'hardware'
0 'computers'
Est-ce possible dans MySQL? Je ne peux pas descendre à la couche d'application et d'effectuer parce que je suis dans l'alimentation de ces un moteur de recherche qui indexe en fonction de l'identifiant. Divers autres SGBD ont quelque chose comme PIVOT et UNPIVOT. Je vous serais reconnaissant toute idée de quelque chose qui me manque.
Mahmoud
P.S.
J'envisage re-normalisation de la base de données comme dernière option, car ce ne sera pas une tâche triviale.
Merci!
La solution
Je suis ceci du livre L'art de SQL, pages 284-286:
Disons que votre nom de la table est foo
.
Tout d'abord, créez une table appelée pivot
:
CREATE Table pivot (
count int
);
Insérez dans cette table autant de lignes que de colonnes que vous souhaitez pivoter dans foo
. Puisque vous avez trois colonnes foo
que vous souhaitez pivoter, créer trois lignes dans le tableau croisé dynamique:
insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);
Maintenant, faites une jointure cartésienne entre foo
et pivot
, en utilisant un CASE
pour sélectionner la bonne colonne en fonction du nombre:
SELECT foo.id, Case pivot.count
When 1 Then cat
When 2 Then one_above
When 3 Then top_level
End Case
FROM foo JOIN pivot;
Cela devrait vous donner ce que vous voulez.
Autres conseils
Après quelques recherches assez vaste, je suis tombé sur cette page qui peut ou non contenir votre réponse. Il est un difficile MySQL, mais d'un point de vue conceptuel, je peux construire une requête qui viseraient à transposer cela en utilisant comme décrit (bien qu'il serait probablement effectuer horriblement). Je suis sûr que nous pouvons trouver un moyen de le faire de la bonne façon.