2015-04-27 52 views
0

我正在嘗試獲取某個特定日期的另一個表中不存在的值的列表。MySQL選擇從另一個表中丟失的條目

表格佈局:我認爲會的工作,

table1 (TABLE) 
id INT(10) 

table2 (TABLE) 
id INT(10) 
table1id INT(10) 
dateupdated DATETIME(19) 

SQLFiddle

查詢是沒有的。

SELECT t1.id FROM Table1 as t1 
    JOIN Table2 as t2 
    ON t1.id=t2.table1id 
    WHERE date(t2.dateupdated) != DATE(NOW()) 

我期待id 7和8從上面的查詢返回,因爲它們不存在於表2中。但我沒有回到行。

反向查詢匹配= DATE(NOW())給了我,確實有匹配

SELECT t1.id FROM Table1 as t1 
JOIN Table2 as t2 
ON t1.id=t2.table1id 
WHERE date(t2.dateupdated) = DATE(NOW()) 

響應:

id 
1 
2 
3 
4 
5 
6 
9 
10 

任何指導,將不勝感激,我仍然學習MySQL。但我在這裏錯過了一些非常簡單的事情。

+0

嘗試使用LEFT具有NULL值的JOIN在右邊的表格中。 – Maximus2012

回答

2

http://sqlfiddle.com/#!9/7a9fc/11

SELECT t1.id FROM Table1 as t1 
    LEFT JOIN Table2 as t2 
    ON t1.id=t2.table1id 
    AND date(t2.dateupdated) = DATE(NOW()) 
    WHERE t2.id IS NULL; 
+0

不應該'和日期(t2.dateupdated)= DATE(NOW())'是WHERE子句的一部分,但我不知道爲什麼查詢在SQL小提琴中工作。 – Maximus2012

+0

這對我來說非常合適。謝謝!我要去閱讀LEFT JOINs,看看我錯在哪裏我的邏輯。 (當我允許時,我會在5分鐘內接受答案) – Andrew

+1

@ Maximus2012它可以是地方或聯合的一部分,因爲它以任何方式應用該過濾器表2。 – SLin

0

由於總是有不止一種方式,所以另一種方式是在子查詢中使用NOT IN運算符(因爲MySQL不支持MINUS)。

SELECT t1.id FROM Table1 as t1 
WHERE t1.id NOT IN 
(SELECT t2.table1id FROM Table2 as t2 
    WHERE date(t2.dateupdated) = DATE(NOW())) 

對於支持MINUS DBMS,你可以這樣做:

SELECT t1.id FROM Table1 as t1 
MINUS 
SELECT t2.table1id FROM Table2 as t2 
    WHERE date(t2.dateupdated) = DATE(NOW()) 
+0

我實際上已經嘗試過了,查詢花了很長的時間(10倍於下面的LEFT JOIN數量) – Andrew

+0

@AndrewWilson你有沒有關於該領域的索引? – SLin

+0

它不應該比LEFT JOIN更長,至少不會有更長的時間。 – Devon

0

這是我喜歡做的方式:

SELECT id FROM Table1 
    WHERE id not in (select table1id from Table2 where date(dateupdated) = date(NOW())) 
相關問題