Page 1 sur 1

requete et join

Posté : 26 sept. 2007, 13:45
par d0m
Bonjour,

je me pose une question sur un certains type de requete.
Disons que j'ai une table table 1 avec 3 champs :
- 1 identifiants de l'objet 1 id1
- 2 identifiants d'objets 2 id2 et id3

on peut comparer ca à un sac (objet 1) à qui on associe 2 élements (objet 2).

Par contre les noms correspondants aux identifiants sont stocké dans une autre table table2

Je voudrais récupérer en une seule requete, en plus des identifiants, les noms correspondants.

Code : Tout sélectionner

SELECT table1.id1,table2.id2,table2.id3 FROM table1,table2 WHERE table1.id=condition
me permet de récupérer les identifiants,
resultat : id1,id2,id3
mais je voudrais un résultat de la forme
resultat : id1,id2,nom2,id3,nom3

Auriez vous une idée?

Posté : 26 sept. 2007, 14:01
par Sedril
Tu pourrais nous montrer les schémas des 2 tables, en précisant les clés primaires des tables ainsi que la clé étrangère qui permet de les relier ?

Cela serait plus simple pour comprendre et te proposer une solution.

Pour le SQL :

Code : Tout sélectionner

SELECT table1.id1, table2.id2, table2.id3 FROM table1, table2 WHERE table1.id = condition
Il manque la jointure entre les 2 tables...

Code : Tout sélectionner

SELECT table1.cle_primaire, table2.cle_primaire, table2.cle_etrangere_table1 FROM table1, table2 WHERE table1.cle_primaire = table2.cle_etrangere_table1 AND table1.cle_primaire = condition
ou plus propre et lisible

Code : Tout sélectionner

SELECT table1.cle_primaire, table2.cle_primaire, table2.cle_etrangere_table1 FROM table1 JOIN table2 ON table1.cle_primaire = table2.cle_etrangere_table1 WHERE table1.cle_primaire = condition

Posté : 26 sept. 2007, 14:15
par d0m
je me suis planté dans la requete désolé:
c'est

Code : Tout sélectionner

SELECT table1.id1, table1.id2, table1.id3 FROM table1, table2 WHERE table1.id = condition
il n'y a justement pas de jointure encore, la jointure est censé récupérer les noms des objets selon l'id

je peux donner les tables bien que le principe est ultra simple :

Code : Tout sélectionner

CREATE TABLE table 1 index MEDIUMINT(8) UNSIGNED NOT NULL auto-increment, id1 MEDIUMINT(8) UNSIGNED NOT NULL default 0, id2 MEDIUMINT(8) UNSIGNED NOT NULL default 0, id3 MEDIUMINT(8) UNSIGNED NOT NULL default 0, PRIMARY KEY(index) CREATE TABLE table 2 id MEDIUMINT(8) UNSIGNED NOT NULL default auto-increment, nom varchar(8) UNSIGNED NOT NULL default '', PRIMARY KEY(id)

Posté : 26 sept. 2007, 14:21
par Sedril
Tu veux donc récupérer en une seule requête sur l'index de la table 1, pour chaque id1, id2 et id3 le nom de l'id correspondant dans la table 2.

Il faut utiliser la technique des alias.

Code : Tout sélectionner

SELECT t1.id1, t2_1.nom, t1.id2, t2_2.nom, t1.id_3, t2_3.nom FROM table1 t1 JOIN table2 t2_1 ON t1.id1=t2_1.id JOIN table2 t2_2 ON t1.id2=t2_2.id JOIN table2 t2_3 ON t1.id3=t2_3.id WHERE t1.index = condition

Posté : 26 sept. 2007, 14:23
par d0m
merci beaucoup :pouce:

Posté : 04 oct. 2007, 14:47
par d0m
j'ai du complexifier ma requete et là j'ai un peu de mal.
Je suis habitué des closes WHERE et pas JOIN
Voilà mes 3 tables :

Code : Tout sélectionner

CREATE TABLE table1 index MEDIUMINT(8) UNSIGNED NOT NULL auto-increment, id MEDIUMINT(8) UNSIGNED NOT NULL default 0, id1_table2 MEDIUMINT(8) UNSIGNED NOT NULL default 0, id2_table2 MEDIUMINT(8) UNSIGNED NOT NULL default 0, PRIMARY KEY(index) CREATE TABLE table2 id MEDIUMINT(8) UNSIGNED NOT NULL default auto-increment, nom varchar(8) UNSIGNED NOT NULL default '', PRIMARY KEY(id) CREATE TABLE table3 id MEDIUMINT(8) UNSIGNED NOT NULL default 0, id_table1 MEDIUMINT(8) UNSIGNED NOT NULL default 0, PRIMARY KEY(id)
le point de départ est la table 3 contenant des objets chacun rataché à un seul objet de la table 1
les objets de la table 1 sont des modèles des objets de la table 3.
A un modèle on associe 2 types (id1_table2 et id2_table2).
Ces types sont stockés avec leur nom dans la table 2.

Ce que je voudrais faire, c'est pour un ensemble d'objets de la table 3,
obtenir les noms des 2 types associés à chacun des objets (à travers leur modèle)
j'ai tenté la requête suivante :

Code : Tout sélectionner

SELECT table3.id as id_objet, table1.id as id_modele,t2_1.nom as nom_type1,t2_2.nom as nom_type2 FROM table1 JOIN table2 t2_1 ON t2_1.id = table1.id1_table2 JOIN table2 t2_2 ON t2_2.id = table1.id2_table2 JOIN table3 ON table3.id_table1 = table1.id WHERE table3.id IN (chaine_des_identifiants)"
Mais la requête ne fonctionne carrément pas. Une idée?

*edit : fausse alerte, je suis moins nul que je ne le pensais, la requête fonctione c'était juste une erreur de nom de colonne.