8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai une requête un peu particulière à réaliser mais je n'y arrive pas. Il s'agit d'une jointure entre deux tables.

<?php
$sql = SELECT T1.champs FROM table1 T1 LEFT JOIN table2 T2 ON T1.id_champs = T2.id_champs WHERE T2.id_champs IS NULL
?>


La jointure est extrèmement simple, je souhaiterais simplement que les T1.champs me soit retourné si, et seulement si, il n'y a aucun enregistrement dans la table T2. En d'autres terme, si la jointure ne se fait pas. J'ai bien essayé en mettant simplement T2.id_champs IS NULL mais ça ne fonctionne pas, forcément.

Savez-vous comment faire en une seule requête ?
Merci d'avance Smiley smile
Salut, si j'ai bien compris le probl&#279;me, il fauf simplement que tu remplaces LEFT JOIN par OUTER JOIN et que tu enl&#279;ves la derni&#279;re clause WHERE Smiley cligne

... Desolé pour l'encodage...
Modifié par Yvan L. (14 Jul 2012 - 12:07)
Salut et merci de ta réponse Smiley smile

OUTER JOIN ne fonctionnant pas, j'ai essayé "LEFT OUTER JOIN" mais ça ne fonctionne toujours pas, le résultat m'est retourné même lorsqu'il existe dans la table n°2. Smiley ohwell
Salut,

Désolé pour le délais de réponse. Est ce que tu as trouvé la solution ?

Si ce n'est pas le cas, voilà une autre piste : une exlusion avec NOT IN, mais il me semble que c'est assez gourmand sur des gros volumes de données :


SELECT t1.* 
FROM table1 t1 
WHERE t1.id NOT IN ( SELECT t3.id FROM table1 t3 LEFT JOIN table2 t2 ON t3.id = t2.t1_fk )
Bonjour,

Tu peux aussi changer ta clause SELECT et chercher sur un autre champ (qui si la ligne existe doit être lui aussi rempli ) et sans faire la jointure dessus. Dans mes cas persos à moi il s'agit souvent d'un titre quelconque ou d'une date de création ( ou un timestamp ) par exemple.


$sql = SELECT T1.champs FROM table1 T1 LEFT JOIN table2 T2 ON T1.id_champs = T2.id_champs WHERE T2.mon_second_champ_qui_est_cense_etre_rempli IS NULL


Bien sûr cela suppose que tu as plus d'un champ dans ta seconde table ^^. Bon après si c'est une bonne pratique ou pas je sais pas Smiley ohwell
Merci d'avoir essayé de m'aider mais malheureusement ça ne fonctionne pas, logique puisque en LEFT JOIN toutes les valeurs de la table 1 sont retournées Smiley ohwell
La solution de Yann est bonne a un inner prés:


SELECT t1.champs
FROM table1 t1 
WHERE t1.champs NOT IN ( SELECT t3.champs FROM table1 t3 INNER JOIN table2 t2 ON t3.champs = t2.champs )

Modifié par JJK801 (16 Jul 2012 - 17:12)