Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
650 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]jointure entre 3 tables

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL]jointure entre 3 tables

n°487072
bkadoum
Posté le 14-08-2003 à 12:47:26  profilanswer
 

quelle est la syntaxe pour faire une liason interne entre 3 tables?

mood
Publicité
Posté le 14-08-2003 à 12:47:26  profilanswer
 

n°487077
simogeo
j'ai jamais tué de chats, ...
Posté le 14-08-2003 à 12:50:03  profilanswer
 

:heink:  
ca depend de ce que tu veux exactement  [:spamafote]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°487088
bkadoum
Posté le 14-08-2003 à 13:08:15  profilanswer
 

en fait ca fait 4 tables:
 
concert
-id_concert
-nom_concert
artiste
-id_artiste
-nom_artiste
-prenom_artiste
instrument
-id_instrument
-nom_instrument
jouer
-ex_concert
-ex_artiste
-ex_instrument
 
Shéma des relations:
concert->jouer
artiste->jouer
instrument->jouer
(relation à 3 pattes)
 
j'aimerai pouvoir lire le contenu des 4 tables dans une même requête.
j'ai essayé ca mais ca marche pas:
 
"SELECT nom_artiste, prenom_artiste, nom_instrument FROM jouer INNER JOIN artiste ON jouer.ex_artiste = artiste.id_artiste INNER JOIN instrument ON jouer.ex_instrument = instrument.id_instrument WHERE ex_concert = 1 order by nom_artiste"

n°487090
Taz
bisounours-codeur
Posté le 14-08-2003 à 13:09:17  profilanswer
 

c'est quoi ces INNER JOIN?

n°487097
bkadoum
Posté le 14-08-2003 à 13:15:20  profilanswer
 

Taz a écrit :

c'est quoi ces INNER JOIN?  


 
ca sert à lire le contenu de plusieurs tables à la fois. C'est bien pratique quand t'a des relations plusieurs à plusieurs dans une base (c'est à dire au moin 3 tables). Comme ca tu t'emmerde pas a faire 300 requêtes pour obtenir un résultat, tu regroupe le tout dans une seule requête et voila!

n°487100
urd-sama
waste of space
Posté le 14-08-2003 à 13:25:02  profilanswer
 

Bkadoum a écrit :


ca sert à lire le contenu de plusieurs tables à la fois. C'est bien pratique quand t'a des relations plusieurs à plusieurs dans une base (c'est à dire au moin 3 tables). Comme ca tu t'emmerde pas a faire 300 requêtes pour obtenir un résultat, tu regroupe le tout dans une seule requête et voila!


ca revient exactement au meme que ca? (il me semble mais je suis pas sure):
SELECT   nom_artiste, prenom_artiste, nom_instrument  
FROM     jouer,artiste,instrument
WHERE    jouer.ex_artiste = artiste.id_artiste  
AND      jouer.ex_instrument = instrument.id_instrument  
AND      ex_concert = 1
ORDER BY nom_artiste ;
 :??:

n°487107
Taz
bisounours-codeur
Posté le 14-08-2003 à 13:39:52  profilanswer
 

urd > je pense comme toi, je voulais juste dire 'pourquoi?' alors que le AND fonctionne parfaitement est plus lisible

n°487113
simogeo
j'ai jamais tué de chats, ...
Posté le 14-08-2003 à 13:44:48  profilanswer
 

personnellement j'utilise le LEFT JOIN dès que je peux  :)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°487166
bkadoum
Posté le 14-08-2003 à 14:21:36  profilanswer
 

Urd-sama a écrit :


ca revient exactement au meme que ca? (il me semble mais je suis pas sure):
SELECT   nom_artiste, prenom_artiste, nom_instrument  
FROM     jouer,artiste,instrument
WHERE    jouer.ex_artiste = artiste.id_artiste  
AND      jouer.ex_instrument = instrument.id_instrument  
AND      ex_concert = 1
ORDER BY nom_artiste ;
 :??:  


 
oui ca marche, je savais pas qu'on pouvais aussi faire comme ca, merci! Mais je me demande si c'est pas mieux d'utiliser quand même les JOIN, pour l'optimisation.


Message édité par bkadoum le 14-08-2003 à 14:22:06
n°487173
bkadoum
Posté le 14-08-2003 à 14:24:00  profilanswer
 

simogeo a écrit :

personnellement j'utilise le LEFT JOIN dès que je peux  :)  


 
hé je t'ai donné les détail alors envoie la solution :) stp

mood
Publicité
Posté le 14-08-2003 à 14:24:00  profilanswer
 

n°487179
Sh@rdar
Ex-PhPéteur
Posté le 14-08-2003 à 14:26:41  profilanswer
 

Bkadoum a écrit :


 
oui ca marche, je savais pas qu'on pouvais aussi faire comme ca, merci! Mais je me demande si c'est pas mieux d'utiliser quand même les JOIN, pour l'optimisation.


 
les AND et JOIN sont absolument équivalents sous MySQL
 
perso LEFT JOIN aussi comme ça si la correspondance n'est pas trouvée ça te sort les champs à NULL


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°487188
bkadoum
Posté le 14-08-2003 à 14:32:47  profilanswer
 

Sh@rdar a écrit :


 
les AND et JOIN sont absolument équivalents sous MySQL
 
perso LEFT JOIN aussi comme ça si la correspondance n'est pas trouvée ça te sort les champs à NULL


 
ok mais tout le reste de mon site j'ai mit des JOIN et j'ai pas envie d'utiliser 1 million de méthodes alors comment on fait avec les JOIN?

n°487192
Sh@rdar
Ex-PhPéteur
Posté le 14-08-2003 à 14:34:47  profilanswer
 

bin tu regarde la doc c'est écrit dessus (comme le port-salut) :whistle:


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°487195
simogeo
j'ai jamais tué de chats, ...
Posté le 14-08-2003 à 14:36:58  profilanswer
 

Bkadoum a écrit :


 
hé je t'ai donné les détail alors envoie la solution :) stp


je te reformules le truc quand j'ai le temps ....avec LEFT JOIN  :)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°487244
bkadoum
Posté le 14-08-2003 à 15:03:09  profilanswer
 

Sh@rdar a écrit :


 
les AND et JOIN sont absolument équivalents sous MySQL
 
perso LEFT JOIN aussi comme ça si la correspondance n'est pas trouvée ça te sort les champs à NULL


 
je viens de lire une doc sur l'optimisation des requêtes SQL et ca dit que les jointure sont mieux que les WHERE...AND...AND...AND
 
http://sqlpro.developpez.com/OptimSQL/SQL_optim.html


Message édité par bkadoum le 14-08-2003 à 15:48:31
n°487464
Sh@rdar
Ex-PhPéteur
Posté le 14-08-2003 à 16:27:03  profilanswer
 

bin moi je lis la doc officielle et ils disent que c'est pareil, qui a raison à ton avis ?
 
http://www.mysql.com/doc/fr/JOIN.html


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°487580
bkadoum
Posté le 14-08-2003 à 18:50:14  profilanswer
 

Sh@rdar a écrit :

bin moi je lis la doc officielle et ils disent que c'est pareil, qui a raison à ton avis ?
 
http://www.mysql.com/doc/fr/JOIN.html


 
j'en sais rien mais par contre j'arrive toujours pas a faire cette requête avec plusieurs JOIN. J'ai essayé l'example dans ta doc mais ca foire!!!

n°487593
simogeo
j'ai jamais tué de chats, ...
Posté le 14-08-2003 à 19:09:44  profilanswer
 

simogeo a écrit :


je te reformules le truc quand j'ai le temps ....avec LEFT JOIN  :)  


 

Code :
  1. SELECT   A.nom_artiste, A.prenom_artiste, I.nom_instrument 
  2. FROM     jouer J
  3. LEFT JOIN artiste A ON J.ex_artiste=A.id_artiste
  4. LEFT JOIN instrument I ON J.ex_instrument = I.id_instrument
  5. WHERE    ex_concert = 1
  6. ORDER BY I.nom_artiste ;


 
pas testé évidemment, mais ca doit fonctionner.  :)  
si tu as a t'en servir tu constateras que ce genre de jointure apporte un confort supplémentaire ....  
edit : cf posts de sh@rdar


Message édité par simogeo le 14-08-2003 à 19:10:51

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°487829
MagicBuzz
Posté le 14-08-2003 à 23:28:57  profilanswer
 

simogeo a écrit :

personnellement j'utilise le LEFT JOIN dès que je peux  :)  


Personnellement, je m'en sert jamais, c'est pas supporté par Oracle (c'est un comble, puisque c'est eux qui ont ajouté cette syntaxe au SQL-92 :lol:)

n°487841
simogeo
j'ai jamais tué de chats, ...
Posté le 14-08-2003 à 23:46:22  profilanswer
 

MagicBuzz a écrit :


c'est pas supporté par Oracle (c'est un comble, puisque c'est eux qui ont ajouté cette syntaxe au SQL-92 :lol:)


chercher l'erreur ...[:meganne]  :D


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°487845
MagicBuzz
Posté le 14-08-2003 à 23:54:30  profilanswer
 

Enfin... Chuis pas sûr que c'est eux qui l'ont rajoutée.
Mais toujours est-il qu'Oracle a présidé à la tête du consortium qui a défini la norme, pendant un bon bout de temps... Et tout comme SQL Server, ils respectent la norme de très loin (m'enfin sql server comprends les inner join au moins... ;))
Avec MySQL qui respecte pas non plus la norme, c'est le pompom :D
 
Y'a que OpenIngre qui supporte à 100% le SQL-92 je crois.
 
Faut dire que vu comme Oracle montre l'exemple, ça donne pas envie de faire un effort :)

n°488058
bkadoum
Posté le 15-08-2003 à 13:17:46  profilanswer
 

simogeo a écrit :


 

Code :
  1. SELECT   A.nom_artiste, A.prenom_artiste, I.nom_instrument 
  2. FROM     jouer J
  3. LEFT JOIN artiste A ON J.ex_artiste=A.id_artiste
  4. LEFT JOIN instrument I ON J.ex_instrument = I.id_instrument
  5. WHERE    ex_concert = 1
  6. ORDER BY I.nom_artiste ;


 
pas testé évidemment, mais ca doit fonctionner.  :)  
si tu as a t'en servir tu constateras que ce genre de jointure apporte un confort supplémentaire ....  
edit : cf posts de sh@rdar


 
ca marche pas, est-ce que y a un ordre a respecter? et pourquoi on utilise pas RIGHT JOIN?

n°488059
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 13:20:09  profilanswer
 

et comme ca ?

Code :
  1. SELECT   A.nom_artiste, A.prenom_artiste, I.nom_instrument 
  2.   FROM     jouer J
  3.   LEFT JOIN artiste A ON J.ex_artiste=A.id_artiste 
  4.   LEFT JOIN instrument I ON J.ex_instrument = I.id_instrument 
  5.   WHERE    J.ex_concert = 1 
  6.   ORDER BY I.nom_artiste ;


 
 
executes le dans PHPmyadmin et donnes moi le message d'erreur  ;)


Message édité par simogeo le 15-08-2003 à 13:20:47

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488061
bkadoum
Posté le 15-08-2003 à 13:24:07  profilanswer
 

non non et non! t'a rien changé la, ca change rien de rien!Quelle merde, je pige pas. Voici l'erreur qu'il m'envoie:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe (opérateur absent) dans l'expression 'J.ex_artiste = A.id LEFT JOIN instrument I ON J.ex_instrument = I.id'.
 
Et c'est quoi phpmyadmin? moi je fais de l'asp


Message édité par bkadoum le 15-08-2003 à 13:29:09
n°488062
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 13:31:54  profilanswer
 

Bkadoum a écrit :

non non et non! t'a rien changé la, ca change rien de rien!


si j'ai changé un truc  :o  
 

Bkadoum a écrit :


Et c'est quoi phpmyadmin? moi je fais de l'asp


quelle est ta base données ? access ? sqlserver ?  :heink:  
 


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488063
urd-sama
waste of space
Posté le 15-08-2003 à 13:32:59  profilanswer
 

access boolay :o

Bkadoum a écrit :

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe (opérateur absent) [...]


Message édité par urd-sama le 15-08-2003 à 13:33:31
n°488064
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 13:34:21  profilanswer
 

Urd-sama a écrit :

access boolay :o


je viens de me lever putain sois indulgente  :o  
merci  ;)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488065
bkadoum
Posté le 15-08-2003 à 13:36:04  profilanswer
 

et ouais, quoi ca marche pas sur access? temps mieux en fait parce que je voulais me mettre a sqlserver...

n°488067
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 13:37:42  profilanswer
 

apparemment access gère aussi les LEFT JOIN...
 

Code :
  1. SELECT   artiste.nom_artiste, artiste.prenom_artiste, instrument.nom_instrument   
  2.     FROM     jouer
  3.     LEFT JOIN artiste ON jouer.ex_artiste=artiste.id_artiste 
  4.     LEFT JOIN instrument ON jouer.ex_instrument = instrument.id_instrument 
  5.     WHERE    jouer.ex_concert = 1 
  6.     ORDER BY artiste.nom_artiste ;


 
alors comme ca  [:spamafote]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488068
urd-sama
waste of space
Posté le 15-08-2003 à 13:39:13  profilanswer
 

je ne sais pas si access supporte ou pas les left/right join, mais c'est pas un peu bizarre ca:
JOIN instrument I ON  
c'est quoi ce I là au-milieu? (enfin peut-etre que je dis des conneries  :whistle: )
 
simo: [:bisou]

n°488069
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 13:42:02  profilanswer
 

Urd-sama a écrit :

je ne sais pas si access supporte ou pas les left/right join, mais c'est pas un peu bizarre ca:
JOIN instrument I ON  
c'est quoi ce I là au-milieu? (enfin peut-etre que je dis des conneries  :whistle: )
 
simo: [:bisou]


c'est pour ca que je reviens a une syntaxe classique .... la syntaxe precedente fonctionne sous Mysql et c'est tant mieux ... du coup je ne pense pas qu'elle soit supporter par un pseudo-sgbd  :whistle:


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488070
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 13:43:53  profilanswer
 


 
[:zoubi]  :sol:


Message édité par simogeo le 15-08-2003 à 13:44:32

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488075
bkadoum
Posté le 15-08-2003 à 13:58:48  profilanswer
 

access c'est gratuit! j'veux bien utiliser un autre a condition qu'il y ait possibilité de l'utiliser chez les hébergeurs et pas pour un prix de fou!


Message édité par bkadoum le 15-08-2003 à 13:59:04
n°488076
urd-sama
waste of space
Posté le 15-08-2003 à 14:01:51  profilanswer
 

access supporte bien la syntaxe sql comparé à mysql pourtant  [:spamafote]  
il a peut-etre plein de défaut mais on peut pas lui donner celui-là.
quand à ta quete de recherche d'hébergeur autre que access, je te souhaite bonne chance :/
(j'ai moi-meme de l'asp/access et je suis pas prête à changer à cause des raisons que tu as ennoncées)

n°488077
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 14:06:36  profilanswer
 

LAMP Linux/Apache/PHP/MySQL poweeerrr  :sol:


Message édité par simogeo le 15-08-2003 à 14:06:53

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488228
MagicBuzz
Posté le 15-08-2003 à 18:11:47  profilanswer
 

access supporte les left et right ainsi que les outer, la n'est pas le problème.
 
par contre, il supporte aussi la syntaxe avec :
 
from t1, t2, t3
where t2.id = t3.parent
and t1.id = t2.parent
 
cette syntaxe est supportée par tous les sgbd, et à l'avantage, je trouve, d'être plus lisible.
 
sinon, pour faire des alias de tables avec access, le mot clé AS est obligatoire (tout comme les alias de sous requête, ou de champ)

n°488230
MagicBuzz
Posté le 15-08-2003 à 18:12:58  profilanswer
 

cette requête doit marcher :
 

SELECT   A.nom_artiste, A.prenom_artiste, I.nom_instrument    
FROM     jouer as J  
LEFT JOIN artiste as A ON J.ex_artiste=A.id_artiste  
LEFT JOIN instrument as I ON J.ex_instrument = I.id_instrument  
WHERE    J.ex_concert = 1  
ORDER BY I.nom_artiste

n°488261
simogeo
j'ai jamais tué de chats, ...
Posté le 15-08-2003 à 19:18:42  profilanswer
 

MagicBuzz a écrit :


sinon, pour faire des alias de tables avec access, le mot clé AS est obligatoire (tout comme les alias de sous requête, ou de champ)


ok  ;) ,
a la différence de mysql ou le as n'est que facultatif


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°488351
bkadoum
Posté le 15-08-2003 à 20:39:41  profilanswer
 

et non ca marche pas non plus, mais c'est bon j'ai trouvé la bonne la. C'est des parenthèses qui faut mettre!
 
SELECT artiste.nom, artiste.prenom, instrument.nom FROM
((jouer INNER JOIN artiste ON jouer.ex_artiste = artiste.id)
INNER JOIN instrument ON jouer.ex_instrument = instrument.id)
WHERE jouer.ex_concert = 1 order by artiste.nom


Message édité par bkadoum le 15-08-2003 à 20:40:22
n°488479
MagicBuzz
Posté le 15-08-2003 à 23:46:25  profilanswer
 

utilise la syntaxe avec des and, ça sera plus simple.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]jointure entre 3 tables

 

Sujets relatifs
[PHP/SQL] Récupérer une valeur[Access/SQL] Quick Question sur les indexes
[ASP/SQL] problème insert into......[Access] Question de base sur les tables/requêtes
[SQL] visualiser un fichier .sqlconvertir un datetime en date avec SQL server
lister les bases et les tables sur SQL serveur via PHP[ACCESS][SQL] Questions sur des requêtes avec Group by
Retrouver un mot de passe Sybase SQL Anywhere 
Plus de sujets relatifs à : [SQL]jointure entre 3 tables


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR