选择所有没有服务的客户

时间:2011-02-16 23:34:49

标签: sql mysql

我有两个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";

3 个答案:

答案 0 :(得分: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'
    );

答案 1 :(得分:0)

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

答案 2 :(得分: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中的任何字段进行null测试,不过我认为该表的id最好。

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