博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql left join 多条记录 1:n 的处理方法
阅读量:6360 次
发布时间:2019-06-23

本文共 1335 字,大约阅读时间需要 4 分钟。

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

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。

 

转载于:https://www.cnblogs.com/jkko123/p/10163068.html

你可能感兴趣的文章
MySQL笔记(一)
查看>>
由莫名其妙的错误开始---浅谈jquery的dom节点创建
查看>>
String StringBuffer StringBuilder对比
查看>>
oracle 中proc和oci操作对缓存不同处理
查看>>
[LeetCode] Spiral Matrix 解题报告
查看>>
60906磁悬浮动力系统应用研究与模型搭建
查看>>
指纹获取 Fingerprint2
查看>>
面试题目3:智能指针
查看>>
flask ORM: Flask-SQLAlchemy【单表】增删改查
查看>>
vim 常用指令
查看>>
nodejs 获取自己的ip
查看>>
你好,C++(16)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算...
查看>>
jdbc 简单连接
查看>>
nasm预处理器(2)
查看>>
nginx web服务理论与实战
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>
你对position了解有多深?看完这2道有意思的题你就有底了...
查看>>
WebSocket跨域问题解决
查看>>
Ubuntu 16.04安装Nginx
查看>>
flutter 教程(一)flutter介绍
查看>>