JeuWeb - Crée ton jeu par navigateur
Problème de jointure ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Problème de jointure ? (/showthread.php?tid=4569)



Problème de jointure ? - php_addict - 05-02-2010

bonjour

je vous soumets un tout petit probleme SQL qui parait tout bete mais surlequel je bloque totalement :cogne: :

on a les TABLE suivantes:

Code :
TABLE JOUEUR                    TABLE RAPPORT
+-----+----------+    +----+---------+---------+-----------+
| id  | nom      |    | id | joueur1 | joueur2 | blablabla |
+-----+----------+    +----+---------+---------+-----------+
|  1  | bertrand |    | 123|    1    |    2    | blablabla |
+-----+----------+    +----+---------+---------+-----------+
|  2  | paul     |    | 124|    2    |    1    | blablabla |
+-----+----------+    +----+---------+---------+-----------+

la requete SELECT joueur1 , joueur2 FROM rapport WHERE id=123 permet d'afficher un truc du genre 1 attaque 2

mais quelle est la requete qui permet d'afficher bertrand attaque paul ?

autrement dit comment joindre mes 2 champs joueur1 et joueur2 vers le champs id de la TABLE [/color]?

est-ce possible d'afficher bertrand attaque paul en ne faisant qu'une seule requete ?

merci de m'avoir lu :respect:

j'ai un peu honte de poser cette question toute bête...:$

bonne journée à toutes et à tous


RE: [SQL] probleme de jointure ? - NicoMSEvent - 05-02-2010

Code :
SELECT j1.nom , j2.nom
FROM rapport r
JOIN joueur j1 ON j1.id=r.joueur1
JOIN joueur j2 ON j2.id=r.joueur2
WHERE id=123

Edit : j'ai cherché ta présentation, je ne l'ai pas trouvée... je n'ai pas trouvé non plus le projet sur lequel tu es, tu pourrais compléter cette lacune, comme tu commence a être ancien ici... Smile


RE: [SQL] probleme de jointure ? - php_addict - 05-02-2010

merci pour ta reponse je vais etudier ceci, le soucis c'est qu'il faut que je fasse une troisieme jointure vers une autre table, mon exemple etait trop simple

sinon pour ma presentation, des que j'ai le temps ;-)
derniere petite question

as tu ommis les AS (allias) , est ce preferable de les mentionner?

encore merci


RE: [SQL] probleme de jointure ? - Anthor - 05-02-2010

Et bien fais en une troisième ^^

Pour reprendre Nico, je mettrais un INNER et non un simple JOIN, même si c'est implicite, c'est toujours bon de le rappeler ^^
D'ailleurs je laisserais un LEFT, avec le login dans les tables de combats, c'est toujours bien dans le cas de suppression de joueurs pour pas planter toute la requête.

Citation :as tu ommis les AS (allias) , est ce preferable de les mentionner?
Préférable surtout que dans le cas présent, le deuxième nom remplace le premier. Dans tous les cas préférable sinon SQL le fait lui même de façon implicite.
Et tout ce qui est implicite demande de la ressource.


RE: [SQL] probleme de jointure ? - php_addict - 05-02-2010

(05-02-2010, 03:39 PM)Anthor a écrit : Et bien fais en une troisième ^^

Pour reprendre Nico, je mettrais un INNER et non un simple JOIN, même si c'est implicite, c'est toujours bon de le rappeler ^^

merci ;-)

j'ai fais un LEFT JION en effet et cela fonctionne a merveille, merci !

par contre j'ai eu beau lire la doc de sql, je ne vois pas la difference entre INNER et LEFT JOIN ...


RE: [SQL] probleme de jointure ? - Sephi-Chan - 05-02-2010

Dans le cas d'un LEFT JOIN, si la clause de jointure ne trouve aucun correspondance dans la table jointe, la ligne est tout de même ajouté au jeu de résultat (et les champs concernant la table jointe sont mis à NULL). Avec un INNER JOIN (par défaut quand tu ne précise pas la nature de la jointure), la ligne est ignorée.


Sephi-Chan

Edit : Correction de mon inversion.


RE: [SQL] probleme de jointure ? - NicoMSEvent - 05-02-2010

Sephi, c'est tout à fait ça, a part qu'il me semble que c'est exactement l'inverse ^^

En effet, le LEFT JOIN te ramène toutes les lignes de la table FROM, et celles qui ont une correspondance dans la table LEFT JOIN. Les données "manquantes" sont remplacées par des NULL

Exemple : si A contient 1,2,3 et B 2,3,4

SELECT A.id,B.id FROM A LEFT JOIN B ON A.id=B.id
Ce qui sera retourné sera
1,NULL
2,2
3,3

SELECT A.id,B.id FROM A INNER JOIN B ON A.id=B.id; qui correspond a la requète de la ligne suivante
SELECT A.id,B.id FROM A ,B WHERE A.id=B.id;
Ce qui sera retourné sera
2,2
3,3

et pour finir :
SELECT A.id,B.id FROM A RIGHT JOIN B ON A.id=B.id
Ce qui sera retourné sera
2,2
3,3
NULL,4

J'espère avoir un peu éclairci tout ça Wink

Edit : Source : http://dev.mysql.com/doc/refman/5.0/fr/join.html


RE: [SQL] probleme de jointure ? - Crimson - 05-02-2010

C'est l'inverse non ? Ou alors j'ai mal compris la phrase.

The INNER JOIN keyword return rows when there is at least one match in both tables.
-> Donc n'affiche que si il y a au moins une correspondance entre les deux tables

The LEFT JOIN keyword returns all rows from the left table (table_name1), even if there are no matches in the right table (table_name2).
->Affiche toutes les lignes de la table à gauche meme si sil n'y a pas de correspondance

http://www.w3schools.com/sql/sql_join_inner.asp

Edit: pas assez rapide. ^^


RE: [SQL] probleme de jointure ? - php_addict - 05-02-2010

merci pour toutes ces precisions, c'est genial, ca marche...