mysql left join 多条记录 1:n 的处理方法

mysql left join 多条记录 1:n 的处理方法,第1张

概述一、准备两张表,文章表和评伦表 随便搞点测试数据 我们运行如下语句: 结果如上所示,主表中有多条记录重复显示了,因为条件 on c.a_id = a.id 主表中的一条记录对应右表中的多条记录,这种1

一、准备两张表,文章表和评伦表

CREATE table `article` (  `ID` int(11) unsigned NOT NulL auto_INCREMENT COMMENT 'ID',`Title` varchar(255) DEFAulT '' COMMENT '文章标题',PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAulT CHARSET=utf8mb4 COMMENT='文章表';CREATE table `comment` (  `ID` int(11) unsigned NOT NulL auto_INCREMENT COMMENT 'ID',`a_ID` int(11) DEFAulT '0' COMMENT '文章ID',`content` varchar(255) DEFAulT '' COMMENT '评伦内容',PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAulT CHARSET=utf8mb4 COMMENT='评伦表';

随便搞点测试数据

 

我们运行如下语句:

select * from article as a left join comment as c on c.a_ID = a.ID;

结果如上所示,主表中有多条记录重复显示了,因为条件 on c.a_ID = a.ID 主表中的一条记录对应右表中的多条记录,这种1 : n 的情况,

left join 的处理方法是主表以重复的方式对应多条右表记录出现在结果集中。

但是这显然不是我们想要的。我们想要以 article 为主表,1 : 1 的显示右表数据。

 

方法一:使用group by ,找出右表一条记录与主表关联

select * from article as a left join (select ID,a_ID,content from comment group by a_ID) as c on c.a_ID = a.ID;

方法二:使用group by 和 min或max聚合函数,找出右表最新或最旧的一条记录与主表关联

select * from article as a left join (select * from comment where ID in (select max(ID) from comment group by a_ID)) as c on c.a_ID = a.ID;

方法三:使用group_concat

select * from article as aleft join (select a_ID,group_concat(concat(ID,',content) order by ID desc separator '_') from comment group by a_ID) as con c.a_ID = a.ID;

所有解决办法,都是一个出发点,使主表与右表的对应关系为1 : 1。

 

总结

以上是内存溢出为你收集整理的mysql left join 多条记录 1:n 的处理方法全部内容,希望文章能够帮你解决mysql left join 多条记录 1:n 的处理方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1164677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存