SQL Join命令可发现最高级别的产品

时间:2018-06-21 05:19:09

标签: mysql sql join

所以基本上我想做的是...我的任务是找到具有“ CSM”,“ LSP”或“ CSD”但还从表“ client_personal”中加入与“​​ client_no”匹配的信息的人员从“ CSM”,“ LSP”或“ CSD”上的搜索结果中

我确定我会做所有的“ bass ackwords”,但最终目标是在表“ client_personal”中显示包括其他字段在内的客户信息,以便销售人员可以为拥有“ CSM”但没有“ LSP”记录的人做销售推销或“ CSD”(被认为是更高的级别)-不幸的是,这里有1:一堆乱七八糟的东西,大量的重复数据和多个条目,以及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       mail@mail.com    555-555-5555
    500001              John Shmoe     mail@mail.com    555-555-5555
    500002              John Howe      mail@mail.com    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       mail@mail.com    555-555-5555

2 个答案:

答案 0 :(得分:2)

尝试使用left join

select 
    T1.`client_no`,
    T2.`product`,
    T2.`status`,
    T2.`pd_date`,
    T1.`name`,
    T1.`email`,
    T1.`phone`
from client_personal T1
left join client_educational T2 on T1.`client_no` = T2.`client_no`
    and T2.`product` = 'CSM'
left join client_educational T3 on T1.`client_no` = T3.`client_no`
    and T3.`product` IN('LSP', 'CSD')
where T2.`client_no` is not null
    and T3.`client_no` is null

| client_no | product | status | pd_date | name | email | phone |
| 500000 | CSM | pd-cert | 2018-06-20 00:00:00 | John Doe | mail@mail.com | 555-555-5555 |

测试DDL

CREATE TABLE client_educational 
    (`client_no` int, `product` varchar(3), `status` varchar(7), `pd_date` datetime)
;

INSERT INTO client_educational 
    (`client_no`, `product`, `status`, `pd_date`)
VALUES
    (500000, 'CSM', 'pd-cert', '2018-06-20 00:00:00'),
    (500001, 'CSM', 'pd-cert', '2018-06-20 00:00:00'),
    (500001, 'LSP', 'pd-cert', '2018-06-20 00:00:00'),
    (500002, 'CSM', 'pd-cert', '2018-06-20 00:00:00'),
    (500002, 'LSP', 'pd-cert', '2018-06-20 00:00:00'),
    (500002, 'CSD', 'pd-cert', '2018-06-20 00:00:00')
;

CREATE TABLE client_personal
    (`client_no` int, `name` varchar(10), `email` varchar(13), `phone` varchar(12))
;

INSERT INTO client_personal
    (`client_no`, `name`, `email`, `phone`)
VALUES
    (500000, 'John Doe', 'mail@mail.com', '555-555-5555'),
    (500001, 'John Shmoe', 'mail@mail.com', '555-555-5555'),
    (500002, 'John Howe', 'mail@mail.com', '555-555-5555')
;

DB Fiddle - TEST DEMO

答案 1 :(得分:1)

您可以对条件使用条件汇总检查仅显示仅具有产品“ 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(两个查询)