requete multitable

VSAB13
Invité n'ayant pas de compte PHPfrance

07 août 2006, 14:08

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]

Eléphant du PHP | 100 Messages

07 août 2006, 14:57

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
Script gratuit de videothèque: PhpMesFilms
sur http://phpmesfilms.dyndns.org/

Invité
Invité n'ayant pas de compte PHPfrance

07 août 2006, 15:01

BOnjour

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 août 2006, 15:42

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 :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 août 2006, 15:45

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

07 août 2006, 16:31

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 août 2006, 16:33

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

07 août 2006, 16:48

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".

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 août 2006, 16:54

:shock: depuis le temps que je me prend la tête :-k
*retourne bouquiner ses bouquins de SQL* :lol:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer