2014-09-19 67 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