所以基本上我想做的是...我的任务是找到具有“ 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
答案 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')
;
答案 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(两个查询)