所以基本上我想做的是。。。我的任务是找到那些有“CSM”、“LSP”或“CSD”的人,同时也从“client_personal”表中加入与“CSM”、“LSP”或“CSD”搜索结果中的“client_no”匹配的信息
我确信我做这些都是“bass ackwords”,但最终目标是显示客户信息,包括“client_personal”表中的其他字段,这样销售人员就可以为那些有“CSM”但没有“LSP”或“CSD”记录(被认为是更高级别的)的人做销售宣传-不幸的是,有1:assload of mess,ton of dupes,多个条目和2:没有一个更容易使用的数据库会“达到最高水平”。
SELECT client_no,product,status,paid_date
FROM client_educational
LEFT JOIN client_personal
ON client_educational.client_no = client_personal.client_no
WHERE product='CSM'
OR product='LSP'
OR product='CSD'
以下是我感兴趣的数据库:
client_educational
client_no product status pd_date
500000 CSM pd-cert 2018-06-20
500001 CSM pd-cert 2018-06-20
500001 LSP pd-cert 2018-06-20
500002 CSM pd-cert 2018-06-20
500002 LSP pd-cert 2018-06-20
500002 CSD pd-cert 2018-06-20
client_personal
client_no name email phone
500000 John Doe [email protected] 555-555-5555
500001 John Shmoe [email protected] 555-555-5555
500002 John Howe [email protected] 555-555-5555
因此,Im需要的不仅是组合结果,而且还需要使用“client_no”行作为唯一标识符,只显示那些只有产品“CSM”而没有“LSP”或“CSD”的人。。。。
像这样的。。。
client_no product status pd_date name email phone
500000 CSM pd-cert 2018-06-20 John Doe [email protected] 555-555-5555
最佳答案
您可以对条件使用条件聚合检查,只显示只有产品“CSM”而没有“LSP”或“CSD”的条件
select cp.client_no,cp.name,cp.email,cp.phone
from client_personal cp
join client_educational ce on cp.client_no = ce.client_no
group by cp.client_no,cp.name,cp.email,cp.phone
having sum(ce.product = 'CSM') > 0
and sum(ce.product IN('LSP', 'CSD')) = 0
在mysql中,当一个表达式在sum(a=b)中使用时,它将产生一个布尔0/1,这样您就可以使用上面的方法获得条件计数。
存在的另一种方式
select cp.*
from client_personal cp
join client_educational ce on cp.client_no = ce.client_no
where ce.product = 'CSM'
and not exists (
select 1
from client_educational
where product IN('LSP', 'CSD')
and client_no = cp.client_no
)
Demo两个查询