2014-05-22 81 views
0

我正在努力加入我的表的內容,即使Join中某些列的數據缺失。我得到了它的一部分工作,但其中一列缺少數據加入的數據被交換。即使沒有匹配的數據,MySQL也會加入

我已經包含了我的測試表,行插入和我正在使用的查詢。

- 測試表

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'); 

--Table內容

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 

--query我與

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 
工作 個

--query結果

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 

--results我試圖讓,列切換爲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 
+0

你想要實現什麼?你能描述一下邏輯嗎? –

+0

加入來自兩個不同日子的'數據'以比較每天的差異。防爆。 5-20-14 1000 - 5-21-14 3000 - >差異2000(差異不需要在查詢中顯示) – user3663131

回答

1

你的問題是,你想保持所有的id s,然後看兩天的比賽。要做到這樣的查詢,先從所有的ID,然後用left join匹配每個條件:

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小提琴是here

編輯:

SGeddes是一個很好的觀點。 group by是不必要的:

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; 
+0

這個作品非常完美,非常感謝!此外,SQL小提琴表示讚賞。 – user3663131

+0

+1 - 但是,我不確定在使用'group by'時需要子查詢。這就是我所做的:http://sqlfiddle.com/#!2/5aec1/10 – sgeddes

+0

@sgeddes。 。 。你有一個好點。聚合是不必要的。 –

0

您是否在尋找右連接?

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的每一個日子,嘗試full outer join。如果你想日期出現(即使沒有出現在任何表中),你需要加入一個額外的(臨時)表日期

+0

沒有正確顯示數據。我只想查看查詢中的2個日期的數據,而不是表中的每個日期。 – user3663131

相關問題