Page 1 sur 1

requete multitable

Posté : 07 août 2006, 14:08
par VSAB13
BOnjour

Comment feriez vous pour extriere un par un des éléments d'un table, les comparer à une autre table et si absents de cette seconde table, l'afficher alors.

Code : Tout sélectionner

$sql="SELECT DISTINCT table1.hits,table1.login,table2.login FROM table1,table2 WHERE table2.login !=table1.login"; ....
Grand merci de vos suggestions[/code]

Posté : 07 août 2006, 14:57
par tanky
avec les requetes imbriquées:

Code : Tout sélectionner

SELECT login FROM table2 WHERE login NOT IN ( SELECT login FROM table1 )
cela renvoi les logins contenu dans la table2 qui ne sont pas présents dans la table1

Posté : 07 août 2006, 15:01
par Invité
BOnjour

C'est une requete imbriquée ? donc seulement en PHP 5??

Posté : 07 août 2006, 15:42
par zeus
les requetes imbriqués dépendent de ton SGBD, pas de la version de PHP que tu utilises.

Par exemple, si tu utilises MySQL, elles ne sont disponibles qu'a partir de la version 4.1 :?

Posté : 07 août 2006, 15:45
par zeus
Sinon, j'aurais plutôt fait une jointure externe

Code : Tout sélectionner

SELECT a.* FROM a LEFT OUTER JOIN b ON a.un_champ = b.un_autre_champ
Cette requete doit te retourner le contenu de la table 'a' qui n'a pas de correspondance dans la table 'b'

PS : ce thread aurait plus sa place dans le forum "SQL". Je le déplace donc ;)

Posté : 07 août 2006, 16:31
par Hubert Roksor
Cette requete doit te retourner le contenu de la table 'a' qui n'a pas de correspondance dans la table 'b'
Je peux me tromper, mais cette requête devrait retourner tous les enregistrements de la table 'a' et à chaque fois que possible l'enregistrement correspondant de la table 'b'. Pour n'avoir que ceux qui n'ont pas de correspondance il faudrait le spécifier dans la clause WHERE:

Code : Tout sélectionner

WHERE b.un_autre_champ IS NULL
Pour reprendre l'exemple du premier post, ça devrait donner quelque chose comme

Code : Tout sélectionner

SELECT DISTINCT t1.login FROM table1 t1 LEFT JOIN table2 t2 USING (login) WHERE t2.login IS NULL
Pour une explication sur LEFT JOIN et USING: Syntaxe de JOIN (mysql.com)
À noter que si t1.login et t2.login sont UNIQUE ou PRIMARY alors le DISTINCT est inutile

Posté : 07 août 2006, 16:33
par zeus
euh, oui, excuse, j'avais oublié la clause WHERE

Par contre, il me semble qu'il faut jointure externe si tu veux qu'il sélectionne les données non présentes dans la table b :-k

Posté : 07 août 2006, 16:48
par Hubert Roksor
euh, oui, excuse, j'avais oublié la clause WHERE
T'as réussi à me faire douter avec ton OUTER, j'ai été obligé de vérifier dans les manuels pour m'assurer que je savais ce que c'était :lol:

Donc après vérification, "OUTER" est implicite dans tous les "LEFT JOIN", "RIGHT JOIN" et "FULL JOIN" c'est pour ça que j'évite de l'employer (à tel point que j'avais oublié ce que c'était ;)), pour ne pas perturber les débutants. D'ailleurs, c'est la même chose pour "t1 INNER JOIN t2", "INNER" est implicite dans "t1 JOIN t2".

Posté : 07 août 2006, 16:54
par zeus
:shock: depuis le temps que je me prend la tête :-k
*retourne bouquiner ses bouquins de SQL* :lol: