1. 程式人生 > >mysql left join 多條記錄 1:n 的處理方法

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='評倫表';

隨便搞點測試資料

 

我們執行如下語句:

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。