MySQL:关联查询实例记录

1.表与表之间的关联查询(

举例三个表,driver 司机表  driver_contract 司机承包表  driver_contract_stage 司机承包表附表(分三期缴费))

CREATE TABLE `driver` (
`driver_id` BIGINT(20) NOT NULL COMMENT '司机id',
`driver_name` varchar(20) DEFAULT NULL COMMENT '姓名',
`id_card` VARCHAR(45) DEFAULT NULL COMMENT '身份证号',
`company_name` VARCHAR(45) DEFAULT NULL COMMENT '公司名称',
`company_id` BIGINT(20) DEFAULT NULL COMMENT '车公司',
`nation` VARCHAR(45) DEFAULT NULL COMMENT '民族',
`birthday` DATE DEFAULT NULL COMMENT '出生日期',
`birth_place` VARCHAR(255) DEFAULT NULL COMMENT '户口地',
`mobile_number` VARCHAR(20) DEFAULT NULL COMMENT '手机',
`business_model` VARCHAR(4) DEFAULT NULL COMMENT '经营模式(1:公营,2:承包)',
`user_code` BIGINT(20) DEFAULT NULL,
`vehicle_compre_add_status` TINYINT(4) DEFAULT NULL COMMENT '车辆综合部新增状态 1.新增中 2.审批中 3.审批通过,-3.审批不通过',
`vehicle_compre_update_status` TINYINT(4) DEFAULT NULL COMMENT '车辆综合部更新状态 1.新增中 2.审批中 3.审批通过,-3.审批不通过',
`vehicle_tech_update_status` TINYINT(4) DEFAULT NULL COMMENT '车辆技术部更新状态 1.新增中 2.审批中 3.审批通过,-3.审批不通过',
`tour_compre_update_status` TINYINT(4) DEFAULT NULL COMMENT '旅发综合部更新状态 1.新增中 2.审批中 3.审批通过,-3.审批不通过',
`dimission_status` TINYINT(4) DEFAULT NULL COMMENT '离职状态 1.正常 2.审批中 3.审批通过,-3.审批不通过',
`blacklist_status` TINYINT(4) DEFAULT NULL COMMENT '黑名单状态 1.正常 2.审批中 3.审批通过,-3.审批不通过',
`driver_status` TINYINT(4) DEFAULT NULL COMMENT '司机状态 1.在职 2.离职 3.黑名单',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '新增人id',
`create_time` datetime DEFAULT NULL COMMENT '新增时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`entry_time` datetime DEFAULT NULL COMMENT '入职时间',
`departure_time` datetime DEFAULT NULL COMMENT '离职时间',
`blacklist_time` datetime DEFAULT NULL COMMENT '加入黑名单时间',
`blacklist_company_id` BIGINT(20) DEFAULT NULL COMMENT '加入黑名单时间',
`driver_license` VARCHAR(255) DEFAULT NULL COMMENT '驾驶证档案号',
`is_driver_bind_cellphone` TINYINT(4) DEFAULT '0' COMMENT '是否绑定手机',
PRIMARY KEY (`driver_id`),
KEY `idx_id_card` (`id_card`),
KEY `idx_mobile_number` (`mobile_number`),
KEY `idx_user_code` (`user_code`)

)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='司机表';


CREATE TABLE `driver_contract` (
`driver_id` BIGINT(20) NOT NULL,
`contract_id` BIGINT(20) DEFAULT NULL COMMENT '合同id',
`contract_version` int(11) DEFAULT NULL COMMENT '承包数据版本',
`total_amount` int(11) DEFAULT NULL COMMENT '总金额(单位分)',
`pay_type` int(11) DEFAULT NULL COMMENT '缴费类型(1一次性,2分期)',
`pay_date` datetime DEFAULT NULL COMMENT '缴费日期(一次性缴费才有该值)',
`oper_start_date` date DEFAULT NULL COMMENT '经营开始日期',
`oper_end_date` date DEFAULT NULL COMMENT '经营结束日期',
`create_name` VARCHAR(20) DEFAULT NULL,
`create_id` BIGINT(20) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_name` VARCHAR(20) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`update_id` BIGINT(20) DEFAULT NULL,
PRIMARY KEY (`driver_id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='司机承包信息';


CREATE TABLE `driver_contract_stage` (
`id` BIGINT(20) NOT NULL,
`driver_id` BIGINT(20) NOT NULL,
`contract_id` BIGINT(20) DEFAULT NULL COMMENT '合同id',
`period` int(11) DEFAULT NULL COMMENT '期数(1一期,2二期,3三期)',
`pay_date` datetime DEFAULT NULL COMMENT '缴费日期',
`deadline_pay_date` date DEFAULT NULL COMMENT '缴费截止日期',
`pay_amount` int(11) DEFAULT NULL COMMENT '缴费金额(单位分)',
`pay_complete` int(11) DEFAULT '0' COMMENT '是否缴费完成(0否1是)',
`overdue` int(11) DEFAULT '0' COMMENT '是否逾期(0否1是)',
PRIMARY KEY (`id`),
UNIQUE KEY `uni_period_id` (`period`,`driver_id`) USING BTREE
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='司机承包分期信息';

​​​​​​​

#缴费统计-下面提供两种方式:

SELECT SUM(IF (dcsf.pay_complete=1 ,dcsf.pay_amount,0))+
SUM(IF (dcsq.pay_complete=1 ,dcsq.pay_amount,0))+
SUM(IF ( dcsr.pay_complete=1,dcsr.pay_amount,0))+
SUM(IF(dc.pay_type = 1,dc.total_amount,0)) 已缴金额,
SUM(IF (dcsf.pay_complete=0 ,dcsf.pay_amount,0))+
SUM(IF (dcsq.pay_complete=0 ,dcsq.pay_amount,0))+
SUM(IF ( dcsr.pay_complete=0,dcsr.pay_amount,0)) 未缴金额
FROM driver d
LEFT JOIN driver_contract dc ON d.driver_id = dc.driver_id
LEFT JOIN driver_contract_stage dcsf ON dc.driver_id = dcsf.driver_id AND dcsf.period = 1
LEFT JOIN driver_contract_stage dcsq ON dc.driver_id = dcsq.driver_id AND dcsq.period = 2
LEFT JOIN driver_contract_stage dcsr ON dc.driver_id = dcsr.driver_id AND dcsr.period = 3
WHERE d.business_model = 2 AND dc.contract_version = 1 AND d.driver_status = 1;


#缴费统计
SELECT SUM(已缴金额),SUM(未缴金额) FROM (
SELECT
SUM(IF(dcs.pay_complete = 1, dcs.pay_amount,0)) 已缴金额 ,
SUM(IF(dcs.pay_complete = 0,dcs.pay_amount,0)) 未缴金额
FROM  driver_contract_stage dcs RIGHT JOIN driver_contract dc
ON dcs.driver_id = dc.driver_id
UNION
SELECT 
SUM(IF(dc.pay_type = 1,dc.total_amount,0))已缴金额,
0 AS 未缴金额
FROM driver_contract dc
) temp ;

主要是说明:

第一种方式  效率 优于  第二种方式,思维逻辑不同;

第二种方式使用了 UNION  结合两次派生的表的结果;

相关sql记录:

#-----------#################################综合统计#######################################------------------
#承包车占比
SELECT SUM(company_id in (453626921985642496, 453626921989836800, 453626921989836801)) as 'all', 
IFNULL(SUM(company_id=453626921985642496), 0) as '岗嘎(辆)',
IFNULL(SUM(company_id=453626921989836800), 0) as '悦吉(辆)',
IFNULL(SUM(company_id=453626921989836801), 0) as '悦腾(辆)'
FROM driver
WHERE business_model=2 and driver_status = 1;

#缴费类型
SELECT IFNULL(SUM(dc.pay_type = 1),0 ) AS '一次性缴费',IFNULL(SUM(dc.pay_type =2 ),0) AS '分期缴费' 
FROM driver_contract dc LEFT OUTER JOIN driver d
ON d.driver_id =dc.driver_id
WHERE d.business_model =2 AND d.driver_status = 1 AND dc.contract_version = 1 ;


#是否逾期(没有统计老数据)
SELECT IFNULL(SUM(dcsf.overdue=1 OR dcss.overdue=1 OR dcst.overdue=1), 0) as '逾期未缴费(辆)',
        IFNULL(SUM(dc.pay_type=1), 0) + IFNULL(SUM(dcsf.overdue=0 AND dcss.overdue=0 AND dcst.overdue=0),0) as '正常缴费(辆)'
        FROM driver d
        LEFT JOIN driver_contract dc ON d.driver_id = dc.driver_id
        LEFT JOIN driver_contract_stage dcsf ON dc.driver_id = dcsf.driver_id and dcsf.period = 1
        LEFT JOIN driver_contract_stage dcss ON dc.driver_id = dcss.driver_id and dcss.period = 2
        LEFT JOIN driver_contract_stage dcst ON dc.driver_id = dcst.driver_id and dcst.period = 3
        WHERE d.business_model = 2 AND dc.contract_version = 1 and d.driver_status = 1;


#是否逾期(没有统计老数据)

SELECT SUM(未逾期), SUM(逾期)
FROM 
(
SELECT SUM(temp.a=3) as 未逾期,
SUM(temp.a != 3) as 逾期
from
(
SELECT 
IFNULL(SUM(dcs.overdue = 0),0) as a,
IFNULL(SUM(dcs.overdue = 1),0) as b,
dcs.driver_id
FROM driver_contract_stage dcs  LEFT JOIN driver_contract dc
ON dcs.driver_id = dc.driver_id
WHERE dc.contract_version = 1
GROUP BY dcs.driver_id
) temp
union
SELECT sum(pay_type=1) as 未逾期,
0 as 逾期
FROM driver_contract 
)temp1;

#缴费统计


SELECT SUM(IF (dcsf.pay_complete=1 ,dcsf.pay_amount,0))+
SUM(IF (dcsq.pay_complete=1 ,dcsq.pay_amount,0))+
SUM(IF ( dcsr.pay_complete=1,dcsr.pay_amount,0))+
SUM(IF(dc.pay_type = 1,dc.total_amount,0)) 已缴金额,
SUM(IF (dcsf.pay_complete=0 ,dcsf.pay_amount,0))+
SUM(IF (dcsq.pay_complete=0 ,dcsq.pay_amount,0))+
SUM(IF ( dcsr.pay_complete=0,dcsr.pay_amount,0)) 未缴金额
FROM driver d
LEFT JOIN driver_contract dc ON d.driver_id = dc.driver_id
LEFT JOIN driver_contract_stage dcsf ON dc.driver_id = dcsf.driver_id AND dcsf.period = 1
LEFT JOIN driver_contract_stage dcsq ON dc.driver_id = dcsq.driver_id AND dcsq.period = 2
LEFT JOIN driver_contract_stage dcsr ON dc.driver_id = dcsr.driver_id AND dcsr.period = 3
WHERE d.business_model = 2 AND dc.contract_version = 1 AND d.driver_status = 1;


#缴费统计
SELECT SUM(已缴金额),SUM(未缴金额) FROM (
SELECT
SUM(IF(dcs.pay_complete = 1, dcs.pay_amount,0)) 已缴金额 ,
SUM(IF(dcs.pay_complete = 0,dcs.pay_amount,0)) 未缴金额
FROM  driver_contract_stage dcs RIGHT JOIN driver_contract dc
ON dcs.driver_id = dc.driver_id
UNION
SELECT 
SUM(IF(dc.pay_type = 1,dc.total_amount,0))已缴金额,
0 AS 未缴金额
FROM driver_contract dc
) temp ;


####################################按公司分组  统计 ###################################################################



#缴费类型(公司分组)
SELECT IFNULL(SUM(dc.pay_type = 1),0 ) AS '一次性缴费',IFNULL(SUM(dc.pay_type =2 ),0) AS '分期缴费' ,d.company_name
FROM driver_contract dc LEFT OUTER JOIN driver d
ON d.driver_id =dc.driver_id
WHERE d.business_model =2 AND d.driver_status = 1 AND dc.contract_version = 1 
GROUP BY d.company_id;

#是否逾期(没有统计老数据-分组公司)
SELECT IFNULL(SUM(dcsf.overdue=1 OR dcss.overdue=1 OR dcst.overdue=1), 0) as '逾期未缴费(辆)',
        IFNULL(SUM(dc.pay_type=1), 0) + IFNULL(SUM(dcsf.overdue=0 AND dcss.overdue=0 AND dcst.overdue=0),0) as '正常缴费(辆)',
				d.company_name
        FROM driver d
        LEFT JOIN driver_contract dc ON d.driver_id = dc.driver_id
        LEFT JOIN driver_contract_stage dcsf ON dc.driver_id = dcsf.driver_id and dcsf.period = 1
        LEFT JOIN driver_contract_stage dcss ON dc.driver_id = dcss.driver_id and dcss.period = 2
        LEFT JOIN driver_contract_stage dcst ON dc.driver_id = dcst.driver_id and dcst.period = 3
        WHERE d.business_model = 2 AND dc.contract_version = 1 and d.driver_status = 1
				GROUP BY d.company_id;

#缴费统计(公司分组)

SELECT SUM(IF (dcsf.pay_complete=1 ,dcsf.pay_amount,0))+
SUM(IF (dcsq.pay_complete=1 ,dcsq.pay_amount,0))+
SUM(IF ( dcsr.pay_complete=1,dcsr.pay_amount,0))+
SUM(IF(dc.pay_type = 1,dc.total_amount,0)) 已缴金额,
SUM(IF (dcsf.pay_complete=0 ,dcsf.pay_amount,0))+
SUM(IF (dcsq.pay_complete=0 ,dcsq.pay_amount,0))+
SUM(IF ( dcsr.pay_complete=0,dcsr.pay_amount,0)) 未缴金额,
d.company_name
FROM driver d
LEFT JOIN driver_contract dc ON d.driver_id = dc.driver_id
LEFT JOIN driver_contract_stage dcsf ON dc.driver_id = dcsf.driver_id AND dcsf.period = 1
LEFT JOIN driver_contract_stage dcsq ON dc.driver_id = dcsq.driver_id AND dcsq.period = 2
LEFT JOIN driver_contract_stage dcsr ON dc.driver_id = dcsr.driver_id AND dcsr.period = 3
WHERE d.business_model = 2 AND dc.contract_version = 1 AND d.driver_status = 1
GROUP BY d.company_id;














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值