记录下前几天遇到的问题:
数据库left join 一对多的关系,由此用个列子记录一下:
用户表:
语言表:
中间用一个关联的,记录每个人会那些编程语言:
需求:页面只用展示用户信息,但是搜索的时候需要可以搜索这门编程语言那些人会;
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
查询出来的结果为
可问题来了,主表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
3 条评论
gekmpa98103ND-网上贷款平台哪个正规http://www.slearning.cn/post/33673.html/
gekmpa98103ND-网上贷款平台哪个正规http://www.slearning.cn/post/33673.html/
njpmah24768RH-2020花户好下款的口子http://www.slearning.cn/tags-6567.html/