2011-02-16 5 views
1

J'ai deux tables MySQL, tblclients et tblservices. Chaque enregistrement dans tblservices représente un service que nous fournissons pour un client et il peut y avoir plusieurs services par client. Les deux tables ont un champ 'status', en tblclients il est 'actif' ou 'inactif' et en tblservices il est 'actif' ou 'terminé'.sélectionnez tous les clients qui n'ont pas de services

J'ai besoin d'écrire une instruction SQL qui affichera une liste de clients actifs qui n'ont pas de services actifs afin que je puisse écrire un script php qui rendra les clients inactifs.

Je comprends comment lister tous les clients qui ont un service qui est terminé, mais je ne comprends pas comment lister les clients qui n'ont pas de services actifs (tous terminés). Existe-t-il un moyen d'interroger ceci en SQL en utilisant des sous-requêtes ou similaires. Jusqu'à présent j'ai:

SELECT tblclients.id, tblclients.email, tblservices.status 
FROM tblclients JOIN tblservices on tblclients.id = tblservices.userid 
WHERE tblclients.status="active" AND tblservices.status="terminated"; 
+0

Avez-vous besoin des clients qui ont jamais eu aucun service du tout? – RichardTheKiwi

+0

Non, les clients sans services ne doivent pas être inclus. – Michelle

Répondre

2

Essayez d'utiliser WHERE [NOT] EXISTS (j'ai munged vos noms de table pour une meilleure lisibilité):

SELECT * FROM clients WHERE 
    clients.status = 'active' AND 
    NOT EXISTS (SELECT * FROM services WHERE 
     services.userid = clients.id AND 
     services.status = 'active' 
    ); 

Cela vous donnera tous vos clients actifs qui n'ont pas de services actifs (ceux-ci comprendront des clients sans services du tout).

Espérons que cela aide!

Mise à jour: Pour les clients sans exclure les services du tout, il suffit d'ajouter cette condition aussi:

SELECT * FROM clients WHERE 
    clients.status = 'active' AND 
    EXISTS (SELECT * FROM services WHERE services.userid = clients.id) AND 
    NOT EXISTS (SELECT * FROM services WHERE 
     services.userid = clients.id AND 
     services.status = 'active' 
    ); 
+0

Comment pouvons-nous exclure les clients sans services? – Michelle

+0

@Mitchell Vous pouvez simplement ajouter une clause "si les services existent pour ce client" à la requête; J'ai mis à jour ma réponse pour inclure ceci. –

+0

Juste une note rapide pour dire que j'ai marqué cette réponse comme correcte non pas parce que c'est la plus correcte mais parce que cela a eu le plus de sens pour moi. Je n'ai aucune idée si les autres réponses étaient des requêtes plus ou moins efficaces. – Michelle

0

Changez votre jointure à un LEFT JOIN et définissez un filtre pour null tblservices.userid.

0

n'a pas tblServices En supposant que les enregistrements avec cette id du client ....

SELECT tblclients.id, tblclients.email, tblservices.status 
FROM tblclients 
LEFT OUTER JOIN tblservices on tblclients.id = tblservices.userid 
WHERE tblservices.id is null 

Ne hésitez pas à utiliser un champ dans tblservices pour le test nul, mais je pense que l'ID de ce tableau serait le mieux.

Si vous devez indiquer un nombre de services égal à 0, utilisez une instruction case.

Questions connexes