2012-09-08 43 views
1

我有兩個表,一個是「電話號碼」表,另一個是「電話」表。調用表有兩列興趣:起始號碼列(c.orig)和終止號碼列(c.term)。左表1中的一列到表2中的兩列

我想寫一個MySQL查詢,它將返回呼叫表中的所有記錄,其中也不是 c.orig號或c.term號存在於數字表(「n.num」列在數字表中)。

這裏是我的SQL查詢:

SELECT 
     c.id, c.date, c.orig, c.term, c.duration 
    FROM calls as c 
    LEFT JOIN numbers as n ON (n.num = c.orig AND n.num = c.term) 
    WHERE 
     c.period = '2012-08' AND 
     n.num IS NULL 
    GROUP BY c.call_id 
    ORDER BY c.call_id 
    LIMIT 0,300 

任何想法?


下面是一些進一步的澄清:

------------------------------ 
table: numbers 
nid  num 
1  111-222-3333 
2  222-333-4444 
3  333-444-5555 
------------------------------ 

------------------------------ 
table: calls 
id  orig   term 
1  333-444-5555 999-999-9999 
2  999-999-9999 111-222-3333 
3  222-333-4444 999-999-9999 
4  888-888-8888 999-999-9999 
5  777-777-7777 999-999-9999 
------------------------------ 

呼叫ID的1,2,和3具有兩個數(原稿或術語),其可以在數字表中找到的至少一個。

呼叫ID 4和5是兩個電話號碼都不在數字表中的情況。這些是我試圖找到的記錄。在電話號碼錶中找不到電話號碼的記錄。

回答

1

你應該 Jointwice爲此,

SELECT 
    c.id, c.date, c.orig, c.term, c.duration 
FROM calls as c 
     LEFT JOIN numbers as n 
      ON (n.num = c.orig) 
     LEFT JOIN numbers m 
      ON m.num = c.term 
WHERE 
    c.period = 'date here' AND 
    m.num IS NULL 
-- GROUP BY c.call_id 
ORDER BY c.call_id 
LIMIT 0,300 

問題,我刪除了你的小組條款,因爲我沒有看到任何聚合函數。你還想做什麼?

更新1

根據您上面的例子,試試這個編輯之一。

呼叫ID 4和5,其中既不的兩個電話號碼 不在數字表情況。那些是我試圖 找到的記錄。既沒有電話號碼中的數字

SELECT a.* 
FROM calls a 
     LEFT JOIN numbers b 
      ON a.orig = b.num 
     LEFT JOIN numbers c 
      ON a.term = c.num 
WHERE b.num IS NULL AND 
     c.num IS NULL 

HPE這是有意義的發現記錄。

+0

只是好奇,爲什麼你在第二次加入時使用「m」而不是「n」? –

+0

'm'和'n'被稱爲別名。不能有兩個表具有相同的別名,這就是我爲什麼這樣做的原因。 –

+0

由於某種原因,這個查詢返回false ...就像它壞了或什麼的。當我嘗試對行進行計數時,它不會像我所期望的那樣返回零。 –

0

你應該保持的是,在邏輯上,在你的ON子句條件適用於每一個行,不給很多人的心,所以你不能真的有任何單一n.num等於c.origc.term,除非,當然,這兩個是相同的數字(這在你的具體情況下是沒有意義的)。

所以,你實際上需要檢查有n.num是否等於要麼c.origc.term。也就是說,只需更換ANDOR和你做:

SELECT 
    c.id, c.date, c.orig, c.term, c.duration 
FROM calls as c 
LEFT JOIN numbers as n ON (n.num = c.orig OR n.num = c.term) 
WHERE 
    c.period = '2012-08' AND 
    n.num IS NULL 
GROUP BY c.call_id 
ORDER BY c.call_id 
LIMIT 0,300 
0

問題已經使用這個詞存在。那麼,這是axactly存在的原因存在:

SELECT c.id, c.date, c.orig, c.term, c.duration 
FROM calls c 
WHERE NOT EXISTS (SELECT * 
    FROM numbers a 
    WHERE a.num = c.orig 
    ) 
AND NOT EXISTS (SELECT * 
    FROM numbers b 
    WHERE b.num = c.term 
    ); 

兩個子查詢甚至可以合併成一個:

SELECT c.id, c.date, c.orig, c.term, c.duration 
FROM calls c 
WHERE NOT EXISTS (SELECT * 
    FROM numbers ab 
    WHERE ab.num = c.orig 
    OR ab.num = c.term 
    ); 

注意:我省略了期限,條件和限制,這都無關實際的問題。

BTW:「date」是SQL中的保留字。最好不要將其用作列名。

相關問題