MySQL关联查询

两张表
表A是一个公有课程表有id, pro_name 两个字段,大概有5们课程,每一名都要上
表B是用户和课程的提醒的关联表,有id ,pro_id ,user_id ,tip_time 四个字段,分别表示ID ,课程ID ,用户ID和提醒上课时间,提醒上课时间不可以为空,而且不是所有的课程都要添加提醒
比如:一共有5门课要上,只要3门课添加了提醒,所以表B 只有三条记录
A表数据

 DROP TABLE IF EXISTS `A`;
CREATE TABLE `A` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pro_name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

 
INSERT INTO `A` VALUES ('1', 'p1');
INSERT INTO `A` VALUES ('2', 'p2');
INSERT INTO `A` VALUES ('3', 'p3');
INSERT INTO `A` VALUES ('4', 'p4');

B表数据

DROP TABLE IF EXISTS `B`;
CREATE TABLE `B` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pro_id` int(11) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `tip_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

 
INSERT INTO `B` VALUES ('1', '3', '1', '2019-04-15 15:24:27');
INSERT INTO `B` VALUES ('2', '4', '1', '2019-04-16 15:24:39');
INSERT INTO `B` VALUES ('3', '5', '1', '2019-04-17 15:24:48');

需求是:按照提醒课程时间给课程表排序
首先想到外连接

select  
A.* ,B.*
from A LEFT 
JOIN B on A.id =B.pro_id AND B.user_id =1
order by B.tip_time DESC ,A.id DESC

记得一定要添加B.user_id =1因为提醒表在实际中不是一个人在用

查询结果
mysql> select  
A.* ,B.*
from A LEFT JOIN B on A.id =B.pro_id AND B.user_id =1
order by B.tip_time DESC ,A.id DESC;
+----+----------+------+--------+---------+---------------------+
| id | pro_name | id   | pro_id | user_id | tip_time            |
+----+----------+------+--------+---------+---------------------+
|  5 | p5       |    3 |      5 |       1 | 2019-04-17 15:24:48 |
|  4 | p4       |    2 |      4 |       1 | 2019-04-16 15:24:39 |
|  3 | p3       |    1 |      3 |       1 | 2019-04-15 15:24:27 |
|  2 | p2       | NULL | NULL   | NULL    | NULL                |
|  1 | p1       | NULL | NULL   | NULL    | NULL                |
+----+----------+------+--------+---------+---------------------+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值