记录下前几天遇到的问题:

数据库left join 一对多的关系,由此用个列子记录一下:

用户表:image.png

语言表:

image.png

中间用一个关联的,记录每个人会那些编程语言:

image.png

需求:页面只用展示用户信息,但是搜索的时候需要可以搜索这门编程语言那些人会;

SELECT u.* FROM user as u LEFT JOIN skill as s on u.id = s.u_id LEFT JOIN language as l on s.p_id = l.id

查询出来的结果为image.png

可问题来了,主表user只有三条数据,但是查出来了五条数据,skill表有八条数据,却查出来八条,并不能正确展示 主表数据

分析SQL

一个人只只会一门编程语言,user表与language表是1:1关系,那么没有问题,但是使用中间表去关联用户表时,编程语言与用户是n:1的关系,当使用 左右连接时,会显示主表全部数据和符合条件的关联表数据 ,所以关联数据会导致主表数据重复。

解决方案

使用group by对重复数据进行过滤。

在使用group by时也需要注意,group by的该列一定是唯一的,如果group列出现数据重复数据时,仅会显示一条数据。

最终sql:

SELECT u.* FROM user as u LEFT JOIN skill as s on u.id = s.u_id LEFT JOIN language as l on s.p_id = l.id GROUP BY u.id

image.png

最后修改:2022 年 12 月 09 日
如果觉得我的文章对你有用,请随意赞赏