JOIN vous avez dit JOIN ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : JOIN vous avez dit JOIN ?

Re: JOIN vous avez dit JOIN ?

par xTG » 05 mai 2011, 08:09

Code : Tout sélectionner

SELECT table1.id, table2.id, table3.id FROM table1 INNER JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id
Cela revient à l'égalité stricte entre table1 et table2.
Puis au résultat précédent complété avec les valeurs concordantes dans table3. Si des valeurs n'existent pas dans table3 elles seront à null.

Tu pourrais donc obtenir par exemple :
table1.id | table2.id | table3.id
1 | 1 | 1
2 | 2 | NULL
3 | 3 | 3
4 | 4 | NULL

Re: JOIN vous avez dit JOIN ?

par foetus69 » 04 mai 2011, 16:45

Re coucou,

Le LEFT et le RIGHT c'est dans le cas de 2 tables, non ?

Mais si ca concerne 3 tables ou plus ?

En tout cas c'est gentil de ta part de te pré-occuper de moi de la sorte.

F69

Re: JOIN vous avez dit JOIN ?

par xTG » 04 mai 2011, 13:40

Avec LEFT ou RIGHT afin de ne pas avoir une égalité parfaite. ;)

Re: JOIN vous avez dit JOIN ?

par foetus69 » 04 mai 2011, 11:29

Re re re,

Dernière chose puisque c'est encore une syntaxe...

Je sais faire trouver une occurrence sur plusieurs tables (plusieurs INNER) mais pas sur soit la table 1 ou la table 2.

Quelqu'un sait comment faire une jointure sur une table OU bien une autre ?

Par avance merci.

Re: JOIN vous avez dit JOIN ?

par foetus69 » 04 mai 2011, 10:09

MERCI A TOUS !!!

On m'a montré où était mon erreur :
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE CONCAT('%', t2.champ2, '%')"; //ne marche pas
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t2.champ2 LIKE CONCAT('%',t3.nom,'%')"; //fonctionne
Comme mentionné sur un autre forum, je n'avais pas bien saisi le sens du ON et l'ordre a son importance ;)

C'est RESOLU, encore MERCI !!!!!!!!!!!!!!!

Re: JOIN vous avez dit JOIN ?

par popy » 03 mai 2011, 17:29

Avec cette syntaxe tu recherches la chaîne t2.champ2 et non la valeur contenu dans t2.champ2 :)
Aucune idée de comment on incorpore un champ plutôt qu'une valeur dans un LIKE...
LIKE CONCAT('%', t2.champ2, '%')

Re: JOIN vous avez dit JOIN ?

par foetus69 » 03 mai 2011, 16:31

Bonjour,

J'ai essayé autre chose :
SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE CONCAT('%', t2.champ2, '%')
Pas mieux...Il faut des valeurs exactes pour que ca marche les jointures ? Ca serait étonnant.

On peut pas matcher de la sorte ?

A -> A
A -> B
A -> C
B -> A
B -> B
...

?

Re: JOIN vous avez dit JOIN ?

par xTG » 02 mai 2011, 13:34

Avec cette syntaxe tu recherches la chaîne t2.champ2 et non la valeur contenu dans t2.champ2 :)
Aucune idée de comment on incorpore un champ plutôt qu'une valeur dans un LIKE...
Cependant pour tester si t2.champ2 contient uniquement "toto" tu peux remplacer le LIKE par une égalité et tu verras que la jointure fonctionne.

Re: JOIN vous avez dit JOIN ?

par foetus69 » 02 mai 2011, 11:38

Bonjour,

J'ai persisté ce week-end mais ne vois toujours pas comment faire :(
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'"
Si le champ nom de la table 3 contient "toto" et que le champ2 de la table 2 contient aussi "toto" ca devrait fonctionner normalement avec cette syntaxe, non ?

F69

Re: JOIN vous avez dit JOIN ?

par foetus69 » 29 avr. 2011, 10:54

Bonjour et merci xTG.

La jointure externe ne fait pas forcément une correspondance c'est l'équivalent quoiqu'il arrive d'un SELECT * from ma table, c'est bien ça ?

Sinon j'ai utilisé l'INNER JOIN :
$query = "SELECT t3.* FROM table3 t3 INNER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2%'";
J'ai rajouté un % autour de t2.champ2 mais mon enregistrement toto de table3 ne ressort pas plus pour autant.

Normal ? Pourquoi ?

P'tite fée

Re: JOIN vous avez dit JOIN ?

par xTG » 29 avr. 2011, 08:08

LEFT JOIN donc c'est normal.
Il prend ce qu'il y a dans t3 et il recherche une correspondance dans t2, mais dans tous les cas tu auras les enregistrements de t3 même s'il n'y a pas de correspondances dans t2.
Si tu veux une égalité sûre et certaine il faut utiliser INNER JOIN.

Re: JOIN vous avez dit JOIN ?

par foetus69 » 28 avr. 2011, 16:50

re re re bonjour Messieurs,

J'ai fait ceci mais pour le coup ne comprends pas pourquoi ça m'affiche "toto" :?
$query = "SELECT t3.* FROM table3 t3 LEFT JOIN table2 t2 ON t3.nom = t2.champ2";
car t2.champ2 ne comporte pas "toto" mais "tt" à la ligne 2.
table1
nom  
titi 
toto 
tata 
tutu 
table2
champ1 | champ2 | champ3  
azerty | tutu | Je suis ravi 
qui suis-je ? | il en va de la vie de tt | oh oh oh 
table3
prenom | nom | age  
jean-michel | toto | 18 
En resaisissant toto à la place de tt j'ai fait ceci et pensais que ca marcherait
$query = "SELECT t3.* FROM table3 t3 RIGHT OUTER JOIN table2 t2 ON t3.nom LIKE '%t2.champ2'";
mais non, même pas :cry:

Re: JOIN vous avez dit JOIN ?

par foetus69 » 28 avr. 2011, 15:27

Bon voilà, pour le coup, j'ai essayé ceci un cas qui me parraissait simple et sympa de prime abord mais pourtant :

J'ai créé 3 tables : table1, table2, table3.

Le but : afficher les enregistrements de table3 si je retrouve la clef étrangère certains champs de table1 ou table2...

Exemple :
dans la table 1 nom = toto (clef primaire car y a qu'un toto, le vrai, le seul)
dans la table 2 commentaires = toto a bien mangé ce midi (une occurence trouvée)
dans la table 3 nom = toto (clef étrangère de table 1)

Comme je trouve des choses en rapport avec "toto" dans l'une des 2 tables, c'est ok j'affiche les infos de la table3 relatives à toto.

Je suis sur cet exo depuis ce midi et m'arrache les cheveux avec les alias en prime #-o

Re: JOIN vous avez dit JOIN ?

par Mazarini » 28 avr. 2011, 15:15

Source : http://trucsweb.com/ASP/trucs.asp?no=104&type=7
2. TOUJOURS utiliser le mot clé « JOIN » bien qu'il ne soit pas indispensable. C'est une erreur fréquente que de préciser une jointure directement dans la clause « WHERE ». Bien qu'il n'y ait aucune différence au niveau de la performance et que le résultat soit généralement le même (pas toujours alors!) il est bon de bien organiser notre requête et de bien identifier les critères de recherche des combinaisons de tables.
Je reconnais que l'on entend plus facilement ce que l'on veut entendre...

Je pense que tes tests proviennent de mysql qui n'est peut être pas un modèle d'optimisation ou que ta base à besoin d'une réorganisation.

D'après ce que je sais, avec DB2, une étape "bind" permet de calculer les optimisations des requêtes d'un programme une fois pour toutes. Du coté d'Oracle, une réorganisation permet aussi de connaitre le coté discriminant des colonnes et le nombre d'enregistrements des tables ce qui aide à l'optimisation. Il est conseillé de refaire le bind des programmes ou la réorg lorsque la base atteint sa taille de croisière pour relancer les optimisations.

Re: JOIN vous avez dit JOIN ?

par popy » 28 avr. 2011, 11:52

J'en retiens qu'au niveau des performance il n'y a pas vraiment de gain (optimisation par le SGBD), mais au niveau de la lisibilité ca apporte un plus certain en séparant l'aspect jointure et l'aspect sélection dans la jointure.
D'ou tu tiens ça ? Des chiffres ? Perso, par curiosité j'ai fait un test comparatif : avec jointure ça prend 10x moins de temps que sans, avec une jointure sur un varchar en clef primaire.