mysqlleftjoin多条记录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='评伦表';多表left join
随便搞点测试数据
我们运⾏如下语句:
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 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;
所有解决办法,都是⼀个出发点,使主表与右表的对应关系为1 : 1。