Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用两个不同表的多mysql查询_Mysql - Fatal编程技术网

使用两个不同表的多mysql查询

使用两个不同表的多mysql查询,mysql,Mysql,我在写查询时遇到了问题。我想从两个表中提取数据,销售和电话。两个表中都有一列记录了电话号码,还有一列记录了日期。我可以很好地进行连接,以匹配对sales的调用,但是我还希望显示两个表中不匹配的条目。基本上在一个页面上显示两个表中匹配的行,然后分别显示每个表中不匹配的行 以下是连接查询: SELECT sales.*, calls.* FROM `sales` JOIN `calls` ON sales.TelephoneNo = calls.TelephoneNo

我在写查询时遇到了问题。我想从两个表中提取数据,销售和电话。两个表中都有一列记录了电话号码,还有一列记录了日期。我可以很好地进行连接,以匹配对sales的调用,但是我还希望显示两个表中不匹配的条目。基本上在一个页面上显示两个表中匹配的行,然后分别显示每个表中不匹配的行

以下是连接查询:

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
那么,尝试使用运算符=来显示不匹配的结果

更新

如果使用左连接而不是连接,会有什么不同

试试这个代码

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 

MySQL不支持完全联接,您需要将左联接和右联接与union结合起来

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

您可能正在寻找一个。我尝试了这个选项,但是我得到的是调用表中的一行对销售表的每一行重复。因此,一个200行的sales表与300行的call表匹配,结果超过5000个。因为它几乎类似于交叉连接,所以左连接没有什么区别。您只会在结果中获得更多的记录,而从其他列中获取其余的数据?我知道每个表都有不同数量的列,因此可能您的解决方案不可能做到这一点。我要说的是,它比我之前提出的要干净得多。是的,您可以在表的SELECT子句中添加'fake'列,其中列数较少。我将用一个例子更新我的答案。
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