我有两个MySQL表,tblclients
和tblservices
。 tblservices
中的每条记录代表我们为客户提供的服务,每个客户端可以有许多服务。两个表都有一个“状态”字段,在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 :(得分: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语句。