mysql join 查询 多条数据_mysql left join 多条记录 1:n 的处理方法

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

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='评伦表';

随便搞点测试数据

06755092b756a3d835b392f19c7c1b16.png

我们运行如下语句:

select * from article as a left join comment as c on c.a_id = a.id;

755e47ed04dde8fdbbbac611585ec8c0.png

结果如上所示,主表中有多条记录重复显示了,因为条件 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;

9429a4c10f1a74416329650b5552aa1b.png

方法二:使用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;

590db74b05b457d6bf759819afeb5219.png

方法三:使用group_concat

select * from article as a

left join (select a_id, group_concat(concat(id, ',', content) order by id desc separator '_') from comment group by a_id) as c

on c.a_id = a.id;

59ebc801edb04359a93809b5fe59ba26.png

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值