MySQL(12)---纪录一次left join一对多关系而引起的BUG

本文探讨了在MySQL中使用left join时遇到的一对多关系导致的查询错误。当订单表与物流表通过订单ID关联,物流表存在重复订单ID时,查询结果超出预期。解决方案包括使用group by和distinct。文章还比较了两者的差异,并提供了适用场景的建议。
摘要由CSDN通过智能技术生成

BUG背景


 我们有一个订单表 和 一个 物流表 它们通过 订单ID 进行一对一的关系绑定。但是由于物流表在保存订单信息的时候没有做判断该订单是否已经有物流信息,
这就变成同一个订单id在物流表中存在多条数据,也就变成了本来订单表只有100条纪录,而left join 物流表后,所查询的订单数据远远大于100条。
总结 趁着上面这个问题,自己来复习下join语句 和 distinct关键字,同时说明如何解决就算关联是一对多,但我还是想只显示100条订单数据的方法。

一、理论

先再讲下关联表查询的几种表达式,网上找了一张图,通过这张图就能理解所有关联查询的含义。

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 。
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录。
inner join(等值连接) 只返回两个表中联结字段相等的行。

二、left join一对一和一对多

1、一对一关联表查询

业务逻辑1 有两张表,一张商品表、一张商品订单表回显订单列表的时候需要订单表关联商品表,如下

1)商品表

DROP TABLE IF EXISTS `t_product`;
CREATE TABLE `t_product` (
  `product_id` char(32) NOT NULL DEFAULT '' COMMENT '主键ID',
  `pro_name` varchar(64) DEFAULT NULL COMMENT '商品名称',
  `cash` double(10,2) DEFAULT '0.00' COMMENT '商品价格',
  `pro_code` varchar(32) DEFAULT NULL COMMENT '商品编号',
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

INSERT INTO `t_product` (`product_id`, `pro_name`, `cash`, `pro_code`)
VALUES
	('1','小米',888.00,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值