2009-10-13 5 views
0

J'ai une liste de contacts, puis j'ai une liste de contacts bloqués. J'ai besoin d'interroger des contacts qui ne sont pas bloqués. Comment puis-je faire une requête où tous les contacts bloqués sont filtrés dans la requête sql?Comment puis-je interroger à partir de deux tables mais obtenir les résultats d'un seul?

+0

MISE À JOUR: Merci pour toutes les réponses, je voudrais savoir comment je peux aussi limiter ces résultats, parce que quand j'ajoute ma LIMIT à la requête SQL de Rudolph, ma requête échoue. – newbie

+0

Ok, maintenant, quand j'ai ajouté LIMIT à la fin de cette requête, cela a fonctionné. merci pour toutes les réponses – newbie

Répondre

7

PSEUDO SQL:

SELECT * FROM CONTACTS as c WHERE c.ID NOT IN (SELECT ID FROM BLOCKEDCONTACTS) 
3

Une autre solution possible serait:

SELECT  * 
FROM  TblContacts AS C 
LEFT JOIN TblBlockedContacts AS BC 
ON   C.ID = BC.ID 
WHERE  C.ID IS NULL 

Je pense que cela devrait être plus performant que d'un NOT IN.

1

je peux suggérer une autre variante:

SELECT  * 
FROM  CONTACTS as c 
WHERE  NOT EXISTS (SELECT * 
         FROM  BLOCKEDCONTACTS as B 
         WHERE  c.id=b.id) 

Choisir cette variante ou l'une des deux autres dépendent des SGBD et des indices que vous utilisez.

3

Vous pouvez suivre le code de johan ou modifier votre db. Au lieu de 2 tables, faites-en une. Et ajoutez simplement un autre champ. Vous pouvez le nommer avec un type enum ("bloqué, débloqué");

Effectuez ensuite ceci:

Select * from contacts where status = 'unblocked'; 

De cette façon, vous donner le processeur sql travail facile car il accède à une seule table au lieu de se joindre à 2 ou plus.

Questions connexes