MySql分组查询规则

一、问题


思考一下假如你有一个这样的需求

有一张账单表(bill_detail),一张开票表(open_invoice)
每一个用户有三种费用类型,分别是水费、污水费、违约金。(分别对应cost_type = 01、02、03)
现在要查询每个用户的欠费总额,和是否开票。(注:只有水费可以开票,其它的不需要)


账单表(bill_detail)

CREATE TABLE `bill_detail` (
	`id` VARCHAR(50) NOT NULL COMMENT 'id',
  	`cost_type` VARCHAR(2) NOT NULL COMMENT '费用类型 01 水费、02 污水费、03 违约金',
	`amount_money` FLOAT(10,2) NOT NULL COMMENT '欠费金额',
	`user_name` VARCHAR(20)  NOT NULL COMMENT '用户名',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账单明细表';

开票表(open_invoice)

CREATE TABLE `open_invoice` (
 	`id` VARCHAR(50) NOT NULL COMMENT 'id',
  	`bill_detail_id` VARCHAR(50) NOT NULL COMMENT '账单明细id',
	`open_invoice_status` INT(1) NOT NULL COMMENT '开票状态(1 已开票, 0 未开票)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开票表';



方法一

我们知道group by是取分组后的第一条数据,所以我们只需要把bill_detail表进行排序,这样每一组(用户名分组)数据,费用类型为 01就是第一个了

SELECT
	sum(amount_money) money,
	invoice.open_invoice_status
FROM
	(SELECT * FROM bill_detail ORDER BY cost_type ASC) bill 
	LEFT JOIN open_invoice invoice ON bill.id = invoice.bill_detail_id
GROUP BY bill.user_name

方法二

SELECT
	sum(amount_money) money,
	invoice.open_invoice_status
FROM
	bill_detail bill 
	LEFT JOIN open_invoice invoice ON bill.id = invoice.bill_detail_id
GROUP BY bill.user_name

分组(group by)后,会选择第一条数据,连接查询会改变原本的查询顺序。(ON后面的字段有值的排在前面,null在后面)


因为我们题目说了,只有水费为01的才会开票,所以连接查询后01这条数据一定会是第一个,无需先排序。



二、结论证明


有一张用户表(user),和一张女朋友表(girl_friend)
我们要查询出来每个人的id、用户名、女朋友名称

注:我们知道不是每一个人都有女朋友的

用户表(user)

CREATE TABLE `user` (
  `id` varchar(50) NOT NULL COMMENT 'id',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';

女朋友表(girl_friend)

CREATE TABLE `girl_friend` (
  `id` varchar(50) NOT NULL COMMENT 'id',
  `user_id` varchar(20) NOT NULL COMMENT '所属用户',
  `girl_name` varchar(20) NOT NULL COMMENT '女朋友名',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='女朋友表';

查询sql

SELECT
	user.id,
	user.user_name,
	girl.girl_name
FROM user 
LEFT JOIN girl_friend girl ON user.id = girl.user_id

实验一

当我们的表数据如下:

iduser_name
1张三
2李四
3王五

iduser_idgirl_name
11芙蓉

查询结果如下:

iduser_namegirl_name
1张三芙蓉
2李四
3王五

实验二

用户表不变,女朋友表数据如下

iduser_idgirl_name
12大乔
12小乔

查询结果如下:

iduser_namegirl_name
2李四大乔
3王五小乔
1张三
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值