2014-11-25 68 views
0

我有兩個表:MySQL的:不存在匹配的記錄

Customer 
+---+-----------+ 
|ID |VoicemailID| 

Voicemail 
+---+----------+ 
|ID |CustomerID| 

Voicemail.CustomerID releates到Customer.ID,反之亦然。

如何從客戶表中選擇行,其中Customer.VoicemailID不再是Vo icemail表中的有效記錄?

這是一種情況,即記錄曾經存在於Voicemail表中,但此後已被刪除。我現在需要找到Customer表中有VoicemailID不存在記錄的所有記錄。

我想:

SELECT DISTINCT Customer.ID, Customer.VoicemailID 
FROM Customers LEFT JOIN Voicemail ON Customer.VoicemailID <> Voicemail.ID 

但是我相信它返回的結果我想,與其中的語音郵件的實例仍然存在導致混合。

+0

我知道外鍵。不幸的是,原始的表設計師沒有使用它們 – 2014-11-25 13:12:57

回答

1

這應該給你你想要的結果:

SELECT Customer.ID, Customer.VoicemailID 
FROM Customer 
    LEFT JOIN Voicemail ON Voicemail.ID = Customer.VoicemailID 
WHERE Voicemail.ID IS NULL 
+0

我已經追加'AND Customer.Voicemail IS NOT NULL',因爲我只是在有數字的實例之後。謝謝:) – 2014-11-25 13:40:11

2

您正處於正確的軌道上,LEFT JOIN。但是你需要尋找匹配,然後在失敗時返回:

SELECT c.ID, c.VoicemailID 
FROM Customer c LEFT JOIN 
    Voicemail v 
    ON c.VoicemailID = v.ID 
WHERE v.ID IS NULL; 
0

您可以使用子查詢並查找不在那裏的行。檢查MySQL的documentationWHERE NOT EXISTS語法:

SELECT * 
FROM table 
WHERE NOT EXISTS(SELECT 1 
       FROM otherTable 
       WHERE table.id = otherTable.someField) 
0
select VoicemailID 
    from Customer 
    where VoicemailID not in (select id from Voicemail) 
0

您可以使用相關子查詢這樣

select * from customer a 
where not exists (select 1 from voicemail b 
        where b.id = a.voicemailid) 
0

這裏是[PHP:5.5.3]中的正確查詢,我在Xampp 1.8.3中使用phpMyAdmin。

SELECT * FROM Customer 
WHERE Customer.VoicemailID NOT IN (SELECT ID FROM Voicemail) 
+0

請在你的回答中加上一點細節,以便它包含一些與代碼相關的上下文。 – 2014-11-25 13:46:49