2010-08-27 29 views
0

我有一个Users表和一个Payments表。我需要一个查询,其中列出PaymentCompleted = 1的付款表中没有记录的用户。单个MySQL查询检查另一个表的行

这些是表(简化的)中的列:

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

查询应选择字段名。

回答

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

+1高性能 – 2010-08-27 16:17:03

+0

这并不完全工作作为一个用户可能有付款记录与PaymentCompleted = 1,另一个PaymentCompleted = 0 – 2010-08-27 16:19:10

+0

@ar:好点,这不是一个合适的解决方案。它可能在OP的情况下工作,具体取决于付款的添加逻辑。但是,查询将返回所有没有付款或没有完成付款的用户(不管是否还有可能已完成付款)。这可能是也可能不是他想要的,尽管不是他所要求的。 – 2010-08-27 21:56:40

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

该死的你7秒快:) – Nicolas78 2010-08-27 15:46:26

0

SELECT * FROM t_users T其中T.userid不存在(来自t_payments吨选择p.userid其中PaymentCompleted = 1)。

一个注释:对于大量记录,“不在”子句可能在计算上效率低下。如果你开始看到性能问题,你可能想要做一些重构/重新设计。

+0

请使用代码格式。 – 2010-08-27 16:17:31

相关问题