mysql级联查询_Mysql中的级联查询 - Heinrich_Chen的个人页面 - OSCHINA - 中文开源技术交流社区...

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

一共是四个表  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的

5b92e3a9e060756d97e7309102807bfd.png

2c4146c96591d7c91c527aa3ce89293a.png

afdfe29c6847fdc7859f307da30d2f64.png

2c837c3551b5dbbbd80c37769b310c52.png

这个是我所有的表

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

61732f0d886fbdd213102eac3e09ad6f.png

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

所以现在开始写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 购买的所有商品

其他两个的话是求补给

6f4c22ad17a15a28b4e57f6eb1c54692.png

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

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

1fd37886b0f9355ba387c27b87805600.png

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

看图

b0d18ff66b1779128cfe6f5c7cfd9f37.png

这个就是咯,现在看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

6678dab9500a6148b6e169016bbad402.png

这个是结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值