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