即使没有匹配的数据,MySQL也会加入
我正在努力联接表的内容,即使联接中的某些列缺少数据。我让它部分工作,但其中一列缺少要连接的数据的数据被交换 我已经包括了我正在使用的测试表、行插入和查询 --试验台即使没有匹配的数据,MySQL也会加入,mysql,sql,Mysql,Sql,我正在努力联接表的内容,即使联接中的某些列缺少数据。我让它部分工作,但其中一列缺少要连接的数据的数据被交换 我已经包括了我正在使用的测试表、行插入和查询 --试验台 CREATE TABLE IF NOT EXISTS `TestTable` ( `ID` int(11) NOT NULL, `Data` int(4) NOT NULL, `LastModified` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `TestTable` (
`ID` int(11) NOT NULL,
`Data` int(4) NOT NULL,
`LastModified` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--测试表数据
INSERT INTO `TestTable` (`ID`, `Data`, `LastModified`) VALUES
(1, 2480, '2014-05-20 00:00:00'),
(1, 2500, '2014-05-21 00:00:00'),
(2, 4560, '2014-05-20 00:00:00'),
(2, 8542, '2014-05-21 00:00:00'),
(3, 4587, '2014-05-21 00:00:00'),
(4, 2561, '2014-05-20 00:00:00'),
(4, 2561, '2014-05-21 00:00:00');
--目录
ID Data LastModified
1 2480 2014-05-20 00:00:00
1 2500 2014-05-21 00:00:00
2 4560 2014-05-20 00:00:00
2 8542 2014-05-21 00:00:00
3 4587 2014-05-21 00:00:00
4 2561 2014-05-20 00:00:00
4 2561 2014-05-21 00:00:00
--我的同事是谁
SELECT `t1`.`ID`, `t1`.`Data`, `t1`.`LastModified`, `t2`.`ID`, `t2`.`Data`, `t2`.`LastModified`
FROM `TestTable` AS `t1`
LEFT JOIN `TestTable` AS `t2`
ON (`t1`.`ID` = `t2`.`ID`)
AND DATE(`t1`.`LastModified`) = '2014-05-20'
AND DATE(`t2`.`LastModified`) = '2014-05-21'
GROUP BY `t1`.`ID`
ORDER BY `t1`.`ID` ASC
--查询结果
ID Data LastModified ID Data LastModified
1 2480 2014-05-20 00:00:00 1 2500 2014-05-21 00:00:00
2 4560 2014-05-20 00:00:00 2 8542 2014-05-21 00:00:00
3 4587 2014-05-21 00:00:00 NULL NULL NULL
4 2561 2014-05-20 00:00:00 4 2561 2014-05-21 00:00:00
--我正在尝试获取的结果,为ID 3切换的列
ID Data LastModified ID Data LastModified
1 2480 2014-05-20 00:00:00 1 2500 2014-05-21 00:00:00
2 4560 2014-05-20 00:00:00 2 8542 2014-05-21 00:00:00
NULL NULL NULL 3 4587 2014-05-21 00:00:00
4 2561 2014-05-20 00:00:00 4 2561 2014-05-21 00:00:00
你在找合适的人选吗
SELECT `t1`.`ID`, `t1`.`Data`, `t1`.`LastModified`, `t2`.`ID`, `t2`.`Data`, `t2`.`LastModified`
FROM `TestTable` AS `t1`
RIGHT JOIN `TestTable` AS `t2`
ON (`t1`.`ID` = `t2`.`ID`)
AND DATE(`t1`.`LastModified`) = '2014-05-20'
AND DATE(`t2`.`LastModified`) = '2014-05-21'
GROUP BY `t1`.`ID`
ORDER BY `t1`.`ID` ASC
否则,如果要显示t1或t2中出现的每个日期,请尝试
完全外部联接。如果你想让每个日期都显示出来(即使是没有显示在任何表中的日期),你需要加入一个额外的(临时)表,其中包含日期,你的问题是你想保留所有的id
s,然后查看这两天的匹配情况。要执行此查询,请从所有ID开始,然后使用左连接
匹配每个条件:
SELECT `t1`.`ID`, `t1`.`Data`, `t1`.`LastModified`,
`t2`.`ID` as id2, `t2`.`Data` as data2, `t2`.`LastModified` as LastModified2
FROM (select distinct id from TestTable) ids left outer join
`TestTable` `t1`
on ids.id = t1.id and DATE(`t1`.`LastModified`) = '2014-05-20' left outer join
`TestTable` `t2`
on ids.`ID` = `t2`.`ID` and DATE(`t2`.`LastModified`) = '2014-05-21'
GROUP BY ids.`ID`
ORDER BY ids.`ID` ASC;
SQL小提琴是
编辑:
斯盖德斯说得很好。分组依据
是不必要的:
SELECT `t1`.`ID`, `t1`.`Data`, `t1`.`LastModified`,
`t2`.`ID` as id2, `t2`.`Data` as data2, `t2`.`LastModified` as LastModified2
FROM (select distinct id from TestTable) ids left outer join
`TestTable` `t1`
on ids.id = t1.id and DATE(`t1`.`LastModified`) = '2014-05-20' left outer join
`TestTable` `t2`
on ids.`ID` = `t2`.`ID` and DATE(`t2`.`LastModified`) = '2014-05-21'
ORDER BY ids.`ID` ASC;
你到底想完成什么?你能描述一下逻辑吗?将两天的“数据”合并起来,比较每天的差异。例5-20-14 1000-5-21-14 3000->2000的差额(差额不需要在查询中显示),数据显示不正确。我只想在查询中显示两个日期的数据,而不是表中的每个日期。这非常好用,非常感谢!另外,SQL FIDLE也很受欢迎。+1--但是,我不确定您在使用分组方式时是否需要子查询。这就是我所做的:@sgedes。你说得很对。聚合是不必要的。