快捷导航

left join关联查询一对多数据重复问题解决方案

xiarou 发表于 2023-1-25 13:38:27 | 显示全部楼层 |阅读模式
209 2
记录下前几天遇到的问题:
数据库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 日
© 允许规范转载

打赏



回复

使用道具 举报

全部回复(3)
占个一楼,
  • 海!外直播 v.ht/33555 禁闻视频 v.ht/37777 赵国,外交停留在声明层面,经济停留在印钞层面,社会停留在江湖层面,文化停留在献媚层面,思想停留在愚民层面,科技停留在山寨层面,内政停留在打压层面.外面没一个真朋友,家
    2023-2-17 05:23
2023-1-25 13:49:22
这个真的难到我了
2023-2-17 20:44:50
卧式加工中心 https://www.machinecc.com
您需要登录后才可以回帖 登录 | 立即注册

Archiver|小黑屋|关于我们

Copyright © 2001-2021, Tencent Cloud.    Powered by Discuz! X3.5

违法和不良信息举报电话:010-00000000 举报邮箱:adminx@adminx.com 未成年人不良信息举报电话:010-00000000

GMT+8, 2023-3-23 04:22 , Processed in 0.027658 second(s), 38 queries .