2014-09-19 63 views
0

我在寫一個查詢時遇到問題。我有兩張表,我想從銷售和電話中獲取數據。在兩個表格中都有一個記錄電話號碼的欄以及一個日期欄。我可以加入JOIN以匹配銷售電話,但是我也想顯示兩個表中不匹配的條目。基本上在單個頁面上顯示與兩個表匹配的行,然後分別與每個表不匹配的行。使用兩個不同表的多個mysql查詢

下面是連接查詢:

SELECT 
    sales.*, 
    calls.* 
FROM `sales` 
JOIN `calls` 
    ON sales.TelephoneNo = calls.TelephoneNo 
WHERE (
     sales.OrderDate >= '$MyStartDATE' 
    AND sales.OrderDate <= '$MyEndDATE' 
) AND (
     calls.CallDate >= '$MyStartDATE' 
    AND calls.CallDate <= '$MyEndDATE' 
) ORDER BY sales.OrderDate 
+1

你可能尋找一個['FULL OUTER右連接JOIN'](http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql)。 – Wrikken 2014-09-19 19:12:28

回答

0

好,儘量使用<>操盤=顯示不匹配結果

SELECT 
    sales.*, 
    calls.* 
FROM `sales` 
JOIN `calls` 
    ON sales.TelephoneNo <> calls.TelephoneNo 
WHERE (
     sales.OrderDate >= '$MyStartDATE' 
    AND sales.OrderDate <= '$MyEndDATE' 
) AND (
     calls.CallDate >= '$MyStartDATE' 
    AND calls.CallDate <= '$MyEndDATE' 
) ORDER BY sales.OrderDate 

UPDATE

如果您使用左加入而不是加入它有所作爲?

試試這個代碼

SELECT sales.*, 
     calls.* 
FROM `sales` 
     LEFT JOIN `calls` 
       ON sales.telephoneno <> calls.telephoneno 
WHERE sales.orderdate >= '$MyStartDATE' 
     AND sales.orderdate <= '$MyEndDATE' 
     AND calls.calldate >= '$MyStartDATE' 
     AND calls.calldate <= '$MyEndDATE' 
ORDER BY sales.orderdate 
+0

我試過這個選項,但是我得到的是一行來自銷售表的每一行重複的調用表。所以一個200行的銷售表與300個調用表相匹配產生了5000多個結果。 – user2843577 2014-09-19 19:40:28

+0

因爲它幾乎類似於交叉連接 – Gervs 2014-09-19 19:48:24

+0

左連接沒有什麼區別。你只會在結果中獲得更多的記錄 – Gervs 2014-09-19 20:06:04

0

MySQL不支持全連接,你需要離開結合,並與工會

SELECT 
    s.OrderDate, 
    PhoneNumber, 
    s.something fake, 
    IF(c.PhoneNumber IS NULL, 'Sales', 'Both') match_from, 
    IF(c.PhoneNumber IS NULL, 0, 1) has_match 
FROM 
    sales s 
LEFT JOIN 
    calls c 
    USING (PhoneNumber) 
WHERE 
    s.OrderDate BETWEEN '$MyStartDATE' AND '$MyEndDATE' 
UNION DISTINCT 
SELECT 
    c1.CallDate, 
    PhoneNumber, 
    'fake', 
    IF(s1.PhoneNumber IS NULL, 'Call', 'Both'), 
    IF(s1.PhoneNumber IS NULL, 0, 1) 
FROM 
    sales s1 
RIGHT JOIN 
    calls c1 
    USING (PhoneNumber) 
WHERE 
    c1.CallDate BETWEEN '$MyStartDATE' AND '$MyEndDATE' 
ORDER BY has_match 
+0

有沒有辦法從其他列中獲取剩餘的數據?我知道每個表都有不同數量的列,因此您的解決方案可能無法實現。我會說它比我想要的要乾淨得多。 – user2843577 2014-09-19 20:45:33

+0

是的,你可以添加'虛假'colums到你的列少的列的SELECT子句。我會用一個例子來更新我的答案。 – Gervs 2014-09-19 20:53:18