2011-02-16 50 views
1

我有两个MySQL表,tblclientstblservicestblservices中的每个记录代表我们为客户提供的服务,并且每个客户端可以有许多服务。两个表都有一个'状态'字段,在tblclients它是“活动”或“非活动”,并在tblservices它是“活动”或“终止”。选择所有没有服务的客户

我需要编写一条SQL语句,它将输出一个没有活动服务的活动客户列表,以便我可以编写一个php脚本,它将使客户端处于非活动状态。

我知道如何列出所有已终止服务的客户端,但我不明白如何列出没有活动服务(全部终止)的客户端。有没有办法在SQL中使用子查询或类似的方式来查询它。到目前为止,我拥有:

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

你需要的客户谁从来就没有任何服务? – RichardTheKiwi 2011-02-17 00:06:57

+0

不,没有服务的客户不应该包括在内。 – Michelle 2011-02-17 00:23:04

回答

2

使用WHERE [NOT] EXISTS尝试(为便于阅读,我已经被改写的你的表名):

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

这会给你没有任何活动服务您的所有活动的客户端(这些将包括没有客户服务)。

希望这会有所帮助!

更新:在所有的排除,没有服务的客户,只需添加该条件,太:

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

将您的联接更改为LEFT JOIN并为null tblservices.userid设置过滤器。

0

假设tblServices没有记录与客户的ID ....

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

随意使用任何领域中tblservices为空测试,但我认为该表的ID将是最好的。

如果您需要将0服务显示为计数,请使用case语句。

相关问题