文档章节

Mysql中的级联查询

Heinrich_Chen
 Heinrich_Chen
发布于 2016/01/12 17:57
字数 629
阅读 3510
收藏 6

我的所有的表都是没有关联关系的,解耦

一共是四个表  tb_user 用户表

CREATE TABLE `tb_user` (
  `id` int(100) NOT NULL AUTO_INCREMENT COMMENT 'Id',
  `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `age` double(255,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

tb_order 订单表

CREATE TABLE `tb_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `price` double(255,0) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

tb_goods 商品表

CREATE TABLE `tb_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `weight` double(11,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

他们的关系是 用户表和订单表是一对多,一个用户可以创建多个订单,

订单和商品是多对多,一个订单可以拥有多个商品,当然一个商品也可以拥有多个订单,这里的商品是类级别的商品

他们是多对多关系所以说必须拥有一个中间表,也就是tb_order_goods

CREATE TABLE `tb_order_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) DEFAULT NULL,
  `goods_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

中间表就是用来关联Order和User的


这个是我所有的表

SELECT*from tb_goods;
SELECT*from tb_order;
SELECT*from tb_order_goods;
SELECT*from tb_user;

现在我们根据用户ID查询用户所有的订单,和订单相关的信息

分析可以知道现在求的是交集,

inner join 和 left join  ,right join的关系就是交集,和补集的关系

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name


这个表很直观,刚刚的需求也就是要交集

所以现在开始写sql

SELECT
    g. NAME
FROM
    tb_order o
INNER JOIN tb_order_goods og ON o.id = og.order_id
INNER JOIN tb_goods g ON og.order_id = g.id
WHERE
    o.user_id = 1


这个sql就是说的是获取user_id =1 购买的所有商品


其他两个的话是求补给

现在让那个我们来试一试,看看结果咯

SELECT
	*
FROM
	tb_order o
LEFT JOIN tb_order_goods og ON og.order_id = o.id
LEFT JOIN tb_goods g ON g.id = og.goods_id
WHERE
	o.user_id = 1

现在我们看看right join ,其实很简单,高中数学好的话,基本没有问题,有问题肯定是智商问题

看图

这个就是咯,现在看sql 语句咯,其实很简单的啦,设计数据库的时候最好不要有管理关系,这样迁移还有拓展不好,你懂得

SELECT
	*
FROM
	tb_order o
RIGHT  JOIN tb_order_goods og ON og.order_id = o.id
RIGHT JOIN tb_goods g ON g.id = og.goods_id
WHERE
	o.user_id = 1

这个是结果


© 著作权归作者所有

Heinrich_Chen
粉丝 14
博文 41
码字总数 39863
作品 0
杭州
高级程序员
私信 提问
mysql级联查询求指点!

小弟想做一个mysql级联查询的通用函数,在测试输出时,临时表中存放的竟然是N条输入参数中的id,百思不得姐,请高手指点: ps:可以用任意一个有级联的表测试,至于查询效率,也请大家指点一下吧!...

magican
2014/04/05
1K
3
Python全栈 MySQL 数据库 (SQL查询、备份、恢复、授权)

ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰   开局一张图 今天接着昨天的说 索引有4种: 普通 索引 :index 唯一索引:unique 主键索引:primary key 外键索引:f...

巴黎香榭
2018/08/02
0
0
Mybatis Collection查询集合只出现一条数据

1、原因 如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条。 2、解决办法 级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的。但在...

_Roger_
2015/10/14
2.8K
2
MySQL 级联复制(A->B->C)

这次的级联复制是在上一篇 MySQL 的主从基础上操作的。除了这个主从之外还需要有一台安装好 MySQL 的服务器,保证是可以正常登陆运行的。 MySQL 主从搭建,参考文章:http://aby028.blog.51...

技术小牛人
2017/11/11
0
0
seci-log 1.13 发布 简化了安装和程序底层结构做了调整

日志分析软件 seci-log 1.13发布,简化了安装和程序底层结构做了调整。上篇文章1.12,有兴趣可以了解一下。本次升级合并了linux和windows版本。这两个版本都为绿色版本(需要提前安装java 1....

赛克蓝德
2015/09/19
183
1

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
5
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
6
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部