[SQL]jointure entre 3 tables

jointure entre 3 tables [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 14-08-2003 à 12:47:26    

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

Reply

Marsh Posté le 14-08-2003 à 12:47:26   

Reply

Marsh Posté le 14-08-2003 à 12:50:03    

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


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 14-08-2003 à 13:08:15    

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"

Reply

Marsh Posté le 14-08-2003 à 13:09:17    

c'est quoi ces INNER JOIN?

Reply

Marsh Posté le 14-08-2003 à 13:15:20    

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!

Reply

Marsh Posté le 14-08-2003 à 13:25:02    

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 ;
 :??:

Reply

Marsh Posté le 14-08-2003 à 13:39:52    

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

Reply

Marsh Posté le 14-08-2003 à 13:44:48    

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


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 14-08-2003 à 14:21:36    

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
Reply

Marsh Posté le 14-08-2003 à 14:24:00    

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

Reply

Marsh Posté le 14-08-2003 à 14:24:00   

Reply

Marsh Posté le 14-08-2003 à 14:26:41    

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
Reply

Marsh Posté le 14-08-2003 à 14:32:47    

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?

Reply

Marsh Posté le 14-08-2003 à 14:34:47    

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
Reply

Marsh Posté le 14-08-2003 à 14:36:58    

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
Reply

Marsh Posté le 14-08-2003 à 15:03:09    

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
Reply

Marsh Posté le 14-08-2003 à 16:27:03    

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
Reply

Marsh Posté le 14-08-2003 à 18:50:14    

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!!!

Reply

Marsh Posté le 14-08-2003 à 19:09:44    

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
Reply

Marsh Posté le 14-08-2003 à 23:28:57    

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:)

Reply

Marsh Posté le 14-08-2003 à 23:46:22    

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
Reply

Marsh Posté le 14-08-2003 à 23:54:30    

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 :)

Reply

Marsh Posté le 15-08-2003 à 13:17:46    

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?

Reply

Marsh Posté le 15-08-2003 à 13:20:09    

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
Reply

Marsh Posté le 15-08-2003 à 13:24:07    

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
Reply

Marsh Posté le 15-08-2003 à 13:31:54    

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
Reply

Marsh Posté le 15-08-2003 à 13:32:59    

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
Reply

Marsh Posté le 15-08-2003 à 13:34:21    

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
Reply

Marsh Posté le 15-08-2003 à 13:36:04    

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

Reply

Marsh Posté le 15-08-2003 à 13:37:42    

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
Reply

Marsh Posté le 15-08-2003 à 13:39:13    

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]

Reply

Marsh Posté le 15-08-2003 à 13:42:02    

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
Reply

Marsh Posté le 15-08-2003 à 13:43:53    


 
[: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
Reply

Marsh Posté le 15-08-2003 à 13:58:48    

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
Reply

Marsh Posté le 15-08-2003 à 14:01:51    

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)

Reply

Marsh Posté le 15-08-2003 à 14:06:36    

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
Reply

Marsh Posté le 15-08-2003 à 18:11:47    

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)

Reply

Marsh Posté le 15-08-2003 à 18:12:58    

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

Reply

Marsh Posté le 15-08-2003 à 19:18:42    

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
Reply

Marsh Posté le 15-08-2003 à 20:39:41    

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
Reply

Marsh Posté le 15-08-2003 à 23:46:25    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed