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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top