MySQL左连接问题,右表做筛选,左表列依然在?

查看:158
本文介绍了MySQL左连接问题,右表做筛选,左表列依然在?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

原料

两张表,一张user表,一张user_log表(这个例子举的不好)

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_log` (
  `id` int(10) NOT NULL,
  `user_id` int(10) NOT NULL,
  `log_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `message` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

问题

现在关联查询

SELECT u.*, ul.log_time, ul.message FROM user u LEFT JOIN user_log ul ON u.id = ul.user_id WHERE ul.log_time > 某个时间点 AND u.id = 4;

这样查询的话,筛选是对连接之后的结果进行的,左表的列不会存在的
我想做到大于某个时间点,右边没有数据,左表的列信息还在,右边列为NULL


可能我没表述清楚把,楼下的回答还是很感谢的:
插入数据

INSERT INTO `user` VALUES ('1', 'wang');
INSERT INTO `user` VALUES ('2', 'meng');
INSERT INTO `user` VALUES ('3', 'zhang');

-- ----------------------------
-- Records of user_log
-- ----------------------------
INSERT INTO `user_log` VALUES ('1', '1', '2017-07-20 13:13:07', 'some data');
INSERT INTO `user_log` VALUES ('2', '1', '2017-07-27 13:13:07', 'some data');
INSERT INTO `user_log` VALUES ('3', '1', '2017-07-28 13:13:07', 'some data');
INSERT INTO `user_log` VALUES ('4', '1', '2017-08-26 13:11:31', 'some data');
INSERT INTO `user_log` VALUES ('5', '1', '2017-08-26 17:11:31', 'some data');
INSERT INTO `user_log` VALUES ('6', '1', '2017-08-27 13:11:31', 'some data');

查询,照楼下的做法:

mysql> SELECT u.*, ul.log_time, ul.message FROM user u LEFT JOIN user_log ul ON u.id = ul.user_id WHERE (ul.log_time > '2017-09-01 07:13:07' OR ul.log_time is NULL) AND u.id = 1;
Empty set

这里其实我想得到结果:
user的信息还是在的,ul的列都是null了

解决方案

把右表的过滤条件放到LEFT JOIN里,才会实现你说的效果,因为WHERE是对关联后的结果做筛选,右表肯定会有值的

SELECT U.*, UL.LOG_TIME, UL.MESSAGE
  FROM USER U
  LEFT JOIN USER_LOG UL
    ON U.ID = UL.USER_ID
   AND (UL.LOG_TIME > '2017-09-01 07:13:07' OR UL.LOG_TIME IS NULL)
 WHERE U.ID = 1;

这篇关于MySQL左连接问题,右表做筛选,左表列依然在?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆