所以基本上我想做的是。。。我的任务是找到那些有“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两个查询

10-06 15:15