MySQL 如何有效去重

场景

现有订单表,还有一张售后表,根据业务需求,现在是同一个订单会有多张售后单,通过获取最新的售后单来展示订单最新的售后信息

初始sql如下,但是这样没法去重,得到最新的售后信息

SELECT
	a.id,
	a.oid,
	a.create_time AS apply_time,
	o.order_num,
	o.aftersale_id
FROM
	mall_shop_order_aftersale AS a
	LEFT JOIN mall_shop_order AS o ON a.oid = o.id

第一个想到的就是通过distinct关键字来去重,但是在这里distinct是不生效的,因为distinct只能用在select查询字段的开头,表示后面所有查询字段的都不重复才算不重复,这里有查询的字段有很多,sql中只列举3~5个,是没法去重的,所以想到通过子查询先去重售后单再关联表,sql如下

SELECT
	a.id,
	a.oid,
	a.create_time AS apply_time,
	o.order_num,
	o.aftersale_id
FROM
	mall_shop_order_aftersale AS a
	JOIN ( SELECT oid, max( create_time ) mtime FROM mall_shop_order_aftersale GROUP BY oid ) t ON a.oid = t.oid 
	AND a.create_time = t.mtime
	LEFT JOIN mall_shop_order AS o ON a.oid = o.id

其实,完全可以在订单表中关联一个最新售后单Id,也可解决

SELECT
	a.id,
	a.oid,
	a.create_time AS apply_time,
	o.order_num,
	o.aftersale_id
FROM
	mall_shop_order o 
	LEFT JOIN mall_shop_order_aftersale AS a on o.aftersale_id = a.id
	where o.aftersale_id > 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值