Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使没有匹配的数据,MySQL也会加入_Mysql_Sql - Fatal编程技术网

即使没有匹配的数据,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。你说得很对。聚合是不必要的。