Récup données réparties dans plusieurs tables.

Invité
Invité n'ayant pas de compte PHPfrance

24 oct. 2008, 09:37

Bonjour à tous,

Je souhaite récupérer sous forme d'une liste unique des données réparties dans 3 tables.
Table 1: contient des infos de base sur les utilisateurs

Code : Tout sélectionner

CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `name` text NOT NULL, `username` varchar(150) NOT NULL default '', `email` varchar(100) NOT NULL default '', PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=84 ;
Table 2: contient des champs de formulaire qui s'affichent pour que l'utilisateur puisse saisir des infos complémentaires. Il n'y a que les paramètres descriptifs de chaque champ car les valeurs sont saisies dans la troisième table.

Code : Tout sélectionner

CREATE TABLE `user_extended_fields` ( `id` int(11) NOT NULL auto_increment, `titreChamp` text NOT NULL, `typeChamp` text NOT NULL, `published` tinyint(1) NOT NULL default '0', `description` text NOT NULL, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;
Table 3: Permet de mapper l'id du champ et sa valeur pour l'utilisateur concerné

Code : Tout sélectionner

CREATE TABLE `user_extended_data` ( `id` int(11) NOT NULL auto_increment, `field_id` int(11) NOT NULL default '0', `user_id` int(11) NOT NULL default '0', `fvalue` text NOT NULL, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=269 ;
Ma question: comment créer la requete sql qui va lister toutes les données utilisateurs: les données de la table 'users' + toutes les autres valeurs saisies par cet utilisateur dans chaque champ stocké dans `user_extended_fields`.

Un résultat de la requete ressemblerait à:
//données de base
'id' => '25'
'name'=> 'John'
'username' => 'FastMan'
'email' => '[email protected]'
//données complémentaires récupérées par le mappage
'adresse' => '4 rue de la soif'
'ville' => paris
'pays' => France
'hobbies' => 'vélo'
J'ai tenté ceci (pas d'erreur) mais ça ne fonctionne qu'en partie: j'arrive à récupérer seulement le 1er champ complémentaire (adresse), mais il me manque les autes:
SELECT u.id, u.name, u.username, u.email , ed.fvalue FROM users AS u, user_extended_data AS ed, user_extended_fields AS ef WHERE ef.id = ed.field_id AND ed.field_id IN (1,2,3,4)
1, 2, 3 et 4 sont les id des champs qui m'intéressent: adresse, ville, pays et hobbies, stockés dans la table 'user_extended_fields'.

adresse, ville, pays et hobbies correspondent aux titres des champs, stockés dans user_extended_fields.titreChamp

Merci à tous pour toute aide ou conseil car je me perds dans la complexité du raisonnement.

Invité
Invité n'ayant pas de compte PHPfrance

25 oct. 2008, 16:36

bon, je repose ma question car elle est peut etre pas tres claire.
J'ai une table qui stocke des valeurs de champs de fomulaire pour des utilisateurs.
Chaque enregistrement contient l'id du champ, l'id de l'utilisateur, et la valeur du champ.
ca donne ceci:

Code : Tout sélectionner

CREATE TABLE `user_extended_data` ( `id` int(11) NOT NULL auto_increment, `field_id` int(11) NOT NULL default '0', `user_id` int(11) NOT NULL default '0', `fvalue` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=269 ;
Mon probleme: chaque id d'utilisateur apparait dans les enregistrements, autant de fois qu'il y a de champs de formulaires.

Ma question: comment construire une requete qui va afficher toutes les valeurs pour chaque utilisateur, en evitant les repetitions d'enregistrements?

En gros afficher pour chaque utilisateur, l'id du champ et sa valeur, comme ceci:

Pour l'utilisateur dont id = 1
id du champ => valeur
id du champ => valeur
id du champ => valeur

Pour l'utilisateur dont id = 2
id du champ => valeur
id du champ => valeur
id du champ => valeur

Pour l'utilisateur dont id = 3
id du champ => valeur
id du champ => valeur
id du champ => valeur

Merci pour vos reponses.

Invité
Invité n'ayant pas de compte PHPfrance

25 oct. 2008, 18:43

je reformule encore ma question:

J'ai une table contenant une liste d'utilisateurs.
Un des champs de la table est pays.
Le pays n'a pas de valeurs uniques puisqu'on peut avoir plusieurs utilisateurs dans le meme pays.
Dans ma table, pays prend donc la valeur 'France' pour de nombreux enregistrements.

Ma question: est il possible de creer une requete qui affiche les enregistrements indexes par pays?

Invité
Invité n'ayant pas de compte PHPfrance

25 oct. 2008, 18:51

j'optimise encore la question:

est-il possible d'indexer les resultats d'une requete sur champ dont les valeurs ne sont pas uniques dans la table?

Eléphant du PHP | 254 Messages

26 oct. 2008, 00:18

Salut :)

Je ne vois pas a priori de facon de faire ce que tu recherche directement. Pour faire ce que tu veux je ferais un traitement a posteriori en PHP, en mettant des ruptures dans la boucle de resultat de ta requete.

resultat SQL:

id_user, id_champ, valeur
id_user, id_champ, valeur
id_user, id_champ, valeur
id_user, id_champ, valeur
id_user, id_champ, valeur
id_user, id_champ, valeur
id_user, id_champ, valeur
id_user, id_champ, valeur

traitement différent en fonction des changements d'id_user

Ca répond pas a ta question mais c'est une autre solution :)