mysql左链接查询的疑问

MySql 码拜 8年前 (2016-01-28) 654次浏览
之前一直以为左链接查询就是将左表符合条件的查出来,右表根据左表去匹配,然后返回以左表为准。
但是在实际使用中,发现假如左表和右表是一对多的关系,那么查询结果会是重复的多条左表数据
例如有个操作表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.* ,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 

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql左链接查询的疑问
喜欢 (0)
[1034331897@qq.com]
分享 (0)