3 votes

Tableau croisé dynamique MySQL

Ces derniers jours, j'ai essayé de trouver une réponse à ce problème. Bien que je n'aie pas trouvé de réponse, ce site continue d'apparaître dans mes résultats de recherche et j'ai donc décidé de l'essayer. Les options de formatage pour les messages sont géniales, BTW.

J'ai un tableau comme :

user_id | form_id | question_id | data_label | data_value  
1         1         1             firstName    Joe  
1         1         2             lastName     Smith  
1         1         3             phone        5554443333  
2         1         1             firstName    Sally  
2         1         2             lastName     Jones  
2         1         3             phone        3334445555  

que je veux devenir :

user_id | firstName | lastName | phone  
1         Joe         Smith      5554443333  
2         Sally       Jones      3334445555  

Je peux trouver un exemple de la manière de procéder. Je ne les comprends pas très bien, mais ils existent. Mon problème unique se pose lorsque cette table unique contient des données saisies à partir d'une variété de formulaires avec n'importe quel nombre possible de champs. Ainsi, je pourrais avoir une table avec :

user_id | form_id | question_id | data_label | data_value  
1         1         1             firstName    Joe  
1         1         2             lastName     Smith  
1         1         3             phone        5554443333  
2         1         1             firstName    Sally  
2         1         2             lastName     Jones  
2         1         3             phone        3334445555  
3         2         1             fav_color    red  
3         2         2             fav_animal   eagle  
4         2         1             fav_color    blue  
4         2         2             fav_animal   dog  

Je vais ensuite passer le form_id en paramètre, rassembler tous les enregistrements de ce formulaire groupés par utilisateurs (ils devraient tous avoir les mêmes étiquettes avec des valeurs différentes), puis afficher ces données sous la forme suivante :

...lorsque form_id = 1, le rapport se présente comme suit :

user_id | firstName | lastName | phone  
1         Joe         Smith      5554443333  
2         Sally       Jones      3334445555  

...lorsque form_id = 2, le rapport se présente comme suit :

user_id | fav_color | fav_animal  
3         red         eagle  
4         blue        dog  

Je suis novice en matière de programmation et de procédures SQL avancées et je ne parviens pas à comprendre comment procéder par moi-même. J'ai besoin que la requête puisse gérer n'importe quel nombre/type de champs sans avoir à saisir les noms exacts des champs possibles dans la requête pour chaque formulaire. Vous remarquerez que la première requête ci-dessus comporte quatre champs alors que la seconde en comporte trois. La solution doit donc être flexible à cet égard.

Le langage SQL peut également être généré à partir d'un langage de programmation, de sorte que cette solution offre davantage d'options, si cela peut vous aider.

Veuillez m'informer si vous ne disposez pas de suffisamment d'informations.

3voto

BugFinder Points 7662

Vous pourriez essayer (sans l'avoir testé) quelque chose comme

select form_id, 
max(case data_label when 'lastName' then data_value else null end) as lastname, 
max(case data_label when 'firstName' then data_value else null end) as firstname,
max(case data_label when 'phone' then data_value else null end) as phone
from mytable 
group by form_id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X