2010-08-27 7 views
0

J'ai une table Utilisateurs et une table Paiements. J'ai besoin d'une requête qui répertorie les utilisateurs qui n'ont pas un enregistrement dans la table des paiements où le champ PaymentCompleted = 1.Requête MySQL unique qui vérifie une autre table pour les lignes

Ce sont les colonnes dans les tableaux (simplifié):

 Users: UserID, UserName 
    Payments: PaymentID, UserID, PaymentCompleted 

La requête doit sélectionner le nom d'utilisateur sur le terrain.

Répondre

2
select distinct UserName 
from Users left outer join Payments on Users.UserID = Payments.UserID 
where PaymentCompleted is NULL or PaymentCompleted != 1 
+0

+1 haute performance –

+0

Cela ne fonctionne pas tout à fait comme un utilisateur pourrait avoir un dossier de paiement avec PaymentCompleted = 1 et une autre avec PaymentCompleted = 0. –

+0

@ar: Bon point, cette n'est pas une bonne solution. Cela peut fonctionner dans la situation d'OP en fonction de la logique d'ajout des paiements. Cependant, la requête retournera tous les utilisateurs qui n'ont pas de paiement ou qui n'ont pas reçu de paiement (indépendamment du fait qu'ils ont potentiellement effectué des paiements). Ce mai mai ou ne pas être ce qu'il cherchait, mais pas exactement ce qu'il a demandé. –

2
SELECT UserName 
    FROM Users u 
    WHERE NOT EXISTS(Select 1 
        from Payments p 
        Where p.UserId = u.UserId 
        AND p.PaymentCompleted = 1) 
+0

sacrément vous étiez 7 secondes plus vite :) – Nicolas78

0

select * from t_users T où T.userid existe pas (sélectionnez p.userid de t_payments t où PaymentCompleted = 1). Une remarque: les clauses "not in" peuvent être inefficaces sur le plan des calculs pour un grand nombre d'enregistrements. Si vous commencez à voir des problèmes de performances, vous pouvez effectuer un refactoring/redesign.

+0

Veuillez utiliser la mise en forme du code. –

Questions connexes