mysql left join数据重复问题


前言

在myql的sql查询中,left join使用越来越多,工作中也遇到了一些问题,left join返回结果中有重复的数据。


一、问题现象

建立两张表模拟场景A表,B表如下,A表代表学生表,B表为学生选修的课程表。

DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of a
-- ----------------------------
INSERT INTO `a` VALUES ('1', '小明', '男');
INSERT INTO `a` VALUES ('2', '小东', '男');
INSERT INTO `a` VALUES ('3', '小西', '女');

DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Aid` int(11) DEFAULT NULL,
  `course` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL,
  UNIQUE KEY `id` (`id`),
  KEY `Aid` (`Aid`),
  CONSTRAINT `aa` FOREIGN KEY (`Aid`) REFERENCES `a` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of b
-- ----------------------------
INSERT INTO `b` VALUES ('1', '1', '语文类型A', '文科');
INSERT INTO `b` VALUES ('2', '2', '数学', '理科');
INSERT INTO `b` VALUES ('4', '1', '英语', '文科');

二、问题重现及解决

2.1.两个表记录如下截图

在这里插入图片描述
在这里插入图片描述

查询sql如下:
在这里插入图片描述

2.2 例子1

如果要查询学生表名字带有明的,并且选修了类型是文科的学生信息,
写下如下sql

select a.*from a LEFT JOIN b on a.id=b.Aid  where a.name like '%明%' 
and b.type like '%文科%'

查询结果看sql上面的截图,这时候查出来的数据会有重复记录,原因就在于
b表中的学生的aid是有两条记录的,也就是a==>b表如果是1对多的关系,
用left join查询会有重复数据。

三.例子

3.1

在工作中left join的情况往往不会很简单,不能直接使用group by 去重,例如如果像以下的场景写sql直接报错。

select a.*,b.type from a as a LEFT JOIN b  as b on a.id=b.Aid  where a.name like '%明%' 
and b.type like '%文科%' GROUP BY a.id order by a.id,a.name

在这里插入图片描述

3.2 sql分析

该条sql是想同时查出a、b两个表的信息,并且要根据a表和b表的条件做限定数据。

四、解决办法

4.1 类似2.2的简单sql,可以通过group by解决如下。

select a.*from a LEFT JOIN b on a.id=b.Aid  where a.name like '%明%' 
and b.type like '%文科%' group by a.id

**加粗样式**

4.2

类似4.1 这样的复杂sql,应该使用distinct去重即可,如下写法

select DISTINCT a.*,b.type from a as a LEFT JOIN b  as b on a.id=b.Aid  where a.name like '%明%' 
and b.type like '%文科%'  order by a.id,a.name

需要注意的是如果distinct在最外层,order by在里层,会使order by的排序失效,类似 select distinct from( select *from xxx order by xxx);类似这种,会失效,需要把order by也移动到外边。
在这里插入图片描述


总结

本文是我对于目前left join的目前解决办法,如果有更好的解决办法,欢迎同学们指出,共同进步,共同学习。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值