2010-08-15 7 views
0

donné une table comme ceci:Aide à la requête MySQL: comment faire pivoter cette table?

============================================== 
| ID1 | ID2 | ID3 | Name   | Value | 
============================================== 
| 16 | 1 | 100 | item_name  | Toys  | 
| 16 | 2 | 101 | item_name  | Computer | 
| 16 | 1 | 102 | item_price | 55  | 
| 16 | 2 | 103 | item_price | 200  | 
| 16 | 1 | 104 | animal_name | dog  | 
| 16 | 2 | 105 | animal_name | cat  | 
| 16 | 1 | 106 | animal_gender | male  | 
| 16 | 2 | 107 | animal_gender | female | 
| 18 | 1 | 100 | item_name  | Toys  | 
| 18 | 2 | 101 | item_name  | Computer | 
| 18 | 1 | 102 | item_price | 55  | 
| 18 | 2 | 103 | item_price | 200  | 
| 18 | 1 | 104 | animal_name | dog  | 
| 18 | 2 | 105 | animal_name | cat  | 
| 18 | 1 | 106 | animal_gender | male  | 
| 18 | 2 | 107 | animal_gender | female | 
---------------------------------------------- 

Comment puis-je utiliser SQL pour faire comme ceci:

============================================================== 
| ID1 | item_name | item_price | animal_name | animal_gender | 
============================================================== 
| 16 | Toys  | 55   | dog   | male   | 
| 16 | Toys  | 55   | cat   | female  | 
| 16 | Computer | 200  | dog   | male   | 
| 16 | Computer | 200  | cat   | female  | 
| 18 | Toys  | 55   | dog   | male   | 
| 18 | Toys  | 55   | cat   | female  | 
| 18 | Computer | 200  | dog   | male   | 
| 18 | Computer | 200  | cat   | female  | 
-------------------------------------------------------------- 

Je créerai la requête SQL en PHP.

+1

Cela ne répond pas vraiment à votre question, mais à mon avis, vous devriez reconsidérer la conception de votre base de données, si possible. –

+0

La première table est en réalité le résultat d'une requête complexe. Je dois juste prendre les données d'un pas de plus et j'en aurais fini avec ça. – StackOverflowNewbie

Répondre

1

sous la direction, après les commentaires de SONewbie

Devrait être conforme à la norme ANSI:

SELECT 
    ID1, 
    MAX(CASE WHEN Name = 'item_name' THEN Value ELSE NULL END) AS item_name, 
    MAX(CASE WHEN Name = 'item_price' THEN Value ELSE NULL END) AS item_price, 
    MAX(CASE WHEN Name = 'animal_name' THEN Value ELSE NULL END) AS animal_name, 
    MAX(CASE WHEN Name = 'animal_gender' THEN Value ELSE NULL END) AS animal_gender 
FROM tbl 
GROUP BY ID1, ID2; 

Cela ne produira pas la sortie désirée exactement - à la place, la sortie ressemblera à ceci:

============================================================== 
| ID1 | item_name | item_price | animal_name | animal_gender | 
============================================================== 
| 16 | Toys  | 55   | dog   | male   | 
| 18 | Toys  | 55   | dog   | male   | 
| 16 | Computer | 200  | cat   | female  | 
| 18 | Computer | 200  | cat   | female  | 
-------------------------------------------------------------- 

C'est parce que ID1 et ID2 lien chat et femelle avec ordinateur et 200 seulement, alors que les mêmes champs de lien chien et homme avec des jouets et 55 seulement. Le regroupement par ID3 introduit beaucoup de NULL, puisque ID1 et ID3 identifient ensemble de façon unique les lignes de données.

+0

Je reçois des valeurs NULL dans certaines cellules. Voir: http://pastebin.com/u4fBLfWc. D'autres idées? – StackOverflowNewbie

+0

@SONewbie, j'ai légèrement modifié ma requête pour qu'elle ne produise pas de valeurs NULL avec les données que vous avez fournies à l'origine - comme décrit dans la réponse éditée, elle ne correspond pas exactement à vos besoins (qui ne peuvent pas correspondre les données fournies). En outre, les données de la sortie de votre lien pastebin.com ne correspondent pas aux données fournies avec la question. –

1

Essayez ceci, pour MySQL (ne fonctionne pas dans la norme ANSI SQL):

SELECT 
    ID1, 
    GROUP_CONCAT(if(Name = 'item_name', Value, NULL)) AS 'item_name', 
    GROUP_CONCAT(if(Name = 'item_price', Value, NULL)) AS 'item_price', 
    GROUP_CONCAT(if(Name = 'animal_name', Value, NULL)) AS 'animal_name', 
    GROUP_CONCAT(if(Name = 'animal_name', Value, NULL)) AS 'animal_name', 
FROM tbl 
GROUP BY ID1, ID2, ID3; 

(non-responsabilité:. Non testé avec vos données)

+0

@chrss, a obtenu la même chose que la suggestion de Mark: http://pastebin.com/u4fBLfWc. D'autres idées? – StackOverflowNewbie