問 題
原料
兩張表,一張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;
掃一掃關注IT屋
微信公眾號搜索 “ IT屋 ” ,選擇關注與百萬開發者在一起