sql join命令用于发现最高级别的产品

vwoqyblh  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(204)

所以基本上我想做的是。。。我的任务是找到那些拥有“csm”、“lsp”或“csd”的人,但也加入了“client\u personal”表中的信息,这些信息与“csm”、“lsp”或“csd”搜索结果中的“client\u no”匹配
我确信我做这些都是“bass ackwords”,但最终目标是显示客户信息,包括表“client\u 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

所以我需要的不仅是合并结果,而且只显示那些只有产品“csm”而没有“lsp”或“csd”的,使用“client\ u no”行作为唯一标识符。。。。
像这样的。。。

client_no           product         status          pd_date         name            email           phone

    500000              CSM             pd-cert         2018-06-20    John Doe       mail@mail.com    555-555-5555
pbpqsu0x

pbpqsu0x1#

您可以对条件使用条件聚合检查,只显示那些只有产品“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
)

两个查询的演示

p4tfgftt

p4tfgftt2#

试试看用吧 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-测试演示

相关问题