jointure entre 3 tables [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 14-08-2003 à 12:50:03
ca depend de ce que tu veux exactement
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"
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!
Marsh Posté le 14-08-2003 à 13:25:02
Bkadoum 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 ;
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
Marsh Posté le 14-08-2003 à 13:44:48
personnellement j'utilise le LEFT JOIN dès que je peux
Marsh Posté le 14-08-2003 à 14:21:36
Urd-sama 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.
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
Marsh Posté le 14-08-2003 à 14:26:41
Bkadoum 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
Marsh Posté le 14-08-2003 à 14:32:47
Sh@rdar a écrit : |
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?
Marsh Posté le 14-08-2003 à 14:34:47
bin tu regarde la doc c'est écrit dessus (comme le port-salut)
Marsh Posté le 14-08-2003 à 14:36:58
Bkadoum a écrit : |
je te reformules le truc quand j'ai le temps ....avec LEFT JOIN
Marsh Posté le 14-08-2003 à 15:03:09
Sh@rdar a écrit : |
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
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
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 ? |
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!!!
Marsh Posté le 14-08-2003 à 19:09:44
simogeo a écrit : |
Code :
|
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
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 )
Marsh Posté le 14-08-2003 à 23:46:22
MagicBuzz a écrit : |
chercher l'erreur ...
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
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
Marsh Posté le 15-08-2003 à 13:17:46
simogeo a écrit :
|
ca marche pas, est-ce que y a un ordre a respecter? et pourquoi on utilise pas RIGHT JOIN?
Marsh Posté le 15-08-2003 à 13:20:09
et comme ca ?
Code :
|
executes le dans PHPmyadmin et donnes moi le message d'erreur
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
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
Bkadoum a écrit : |
quelle est ta base données ? access ? sqlserver ?
Marsh Posté le 15-08-2003 à 13:32:59
access boolay
Bkadoum a écrit : Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) |
Marsh Posté le 15-08-2003 à 13:34:21
Urd-sama a écrit : access boolay |
je viens de me lever putain sois indulgente
merci
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...
Marsh Posté le 15-08-2003 à 13:37:42
apparemment access gère aussi les LEFT JOIN...
Code :
|
alors comme ca
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 )
simo:
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: |
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
Marsh Posté le 15-08-2003 à 13:43:53
Urd-sama a écrit : |
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!
Marsh Posté le 15-08-2003 à 14:01:51
access supporte bien la syntaxe sql comparé à mysql pourtant
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)
Marsh Posté le 15-08-2003 à 14:06:36
LAMP Linux/Apache/PHP/MySQL poweeerrr
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)
Marsh Posté le 15-08-2003 à 18:12:58
cette requête doit marcher :
SELECT A.nom_artiste, A.prenom_artiste, I.nom_instrument |
Marsh Posté le 15-08-2003 à 19:18:42
MagicBuzz a écrit : |
ok ,
a la différence de mysql ou le as n'est que facultatif
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
Marsh Posté le 14-08-2003 à 12:47:26
quelle est la syntaxe pour faire une liason interne entre 3 tables?