之前一直以为左链接查询就是将左表符合条件的查出来,右表根据左表去匹配,然后返回以左表为准。
但是在实际使用中,发现假如左表和右表是一对多的关系,那么查询结果会是重复的多条左表数据
例如有个操作表tb_oper,有 id , content等字段 然后有个操作记录表tb_oper_log,有id,oper_id(对应tb_oper主键)
原因是操作log可能有多条,所以假如左查询 虽然tb_oper实际有一条,但返回多条重复值
但是在实际使用中,发现假如左表和右表是一对多的关系,那么查询结果会是重复的多条左表数据
例如有个操作表tb_oper,有 id , content等字段 然后有个操作记录表tb_oper_log,有id,oper_id(对应tb_oper主键)
原因是操作log可能有多条,所以假如左查询 虽然tb_oper实际有一条,但返回多条重复值
select oper.* from tb_oper oper left join tb_oper_log log on oper.id = log.oper_id where oper.id = 1;
应该怎么查让他返回一条tb_oper匹配的数据呢?而不是多条重复的呢?
这样是不是也说明虽然查询以左表为主,但是返回数量并不一定是左表的实际数量呢?
求高手解惑
解决方案:20分
这样关联是会有重复的记录,但看你的需求是查询oper表,不要重复数据,则不需要关联log表,
直接
直接
select * from tb_oper where id=1;
即可。
一般业务上而言,tb_oper为父表, tb_oper_log子表,且业务的大部分查询是围绕子表,即log表为左表。
select oper.* from tb_oper_log log left join tb_oper oper on oper.id = log.oper_id and oper.id = 1;
解决方案:20分
是这样的,到底怎么关联,这个要看你的实际需求,例如你的语句只需要返回 oper,而不需要log的数据,那么直接写成这样就可以:
select oper.* from tb_oper oper
假如,你想log的也出来,而又不想要重复,那么就要考虑一个问题了,就是1对多的情况下,oper出来1条是没问题,到那时你想让log的数据也出来,但是1对多,那么log到底出来哪一条呢? 你要想好,假如你要出来最近一条,那可以这么写:
select oper.* from tb_oper oper
假如,你想log的也出来,而又不想要重复,那么就要考虑一个问题了,就是1对多的情况下,oper出来1条是没问题,到那时你想让log的数据也出来,但是1对多,那么log到底出来哪一条呢? 你要想好,假如你要出来最近一条,那可以这么写:
select oper.* ,log.* from tb_oper oper left join ( select oper_id,其他字段 from ( select log.* from tb_oper_log log order by 时间字段 desc ) log group by oper_id )log on oper.id = log.oper_id