MySQL内部加入不同的结果

时间:2012-10-12 08:56:19

标签: mysql

我想弄清楚为什么以下两个查询会返回不同的结果:

SELECT DISTINCT i.id, i.date  
FROM `tblinvoices` i
INNER JOIN `tblinvoiceitems`  it ON it.userid=i.userid
INNER JOIN `tblcustomfieldsvalues`  cf ON it.relid=cf.relid  
WHERE i.`tax` = 0  
AND i.`date`  BETWEEN  '2012-07-01' AND '2012-09-31'  

SELECT DISTINCT i.id, i.date  
FROM `tblinvoices` i
WHERE i.`tax` = 0  
AND i.`date`  BETWEEN  '2012-07-01' AND '2012-09-31'  

显然不同之处在于内部联接,但我不明白为什么内部联接的结果返回的结果少于没有它的结果,我会想到因为我没有做任何交叉表引用它们应该返回相同的结果。

我正在努力的最后一个问题是

SELECT DISTINCT i.id, i.date  
FROM `tblinvoices` i
INNER JOIN `tblinvoiceitems`  it ON it.userid=i.userid
INNER JOIN `tblcustomfieldsvalues`  cf ON it.relid=cf.relid  
WHERE  cf.`fieldid` =5  
AND  cf.`value` 
REGEXP  '[A-Za-z]'
AND i.`tax` = 0  
AND i.`date`  BETWEEN  '2012-07-01' AND '2012-09-31'  

但是因为当我添加内部联接时它看起来不正确的结果不同(它会删除一些应该有效的结果),所以它目前无效,谢谢。

2 个答案:

答案 0 :(得分:2)

INNER JOIN语句将检索存储在jion语句的两个表中的行。 尝试LEFT JOIN语句。这将返回第一个表中的行,但在第二个表中不需要:

SELECT DISTINCT i.id, i.date  
FROM `tblinvoices` i
LEFT JOIN `tblinvoiceitems`  it ON it.userid=i.userid
LEFT JOIN `tblcustomfieldsvalues`  cf ON it.relid=cf.relid  
WHERE i.`tax` = 0  
AND i.`date`  BETWEEN  '2012-07-01' AND '2012-09-31'  

答案 1 :(得分:2)

INNER JOIN表示仅显示两个表中存在相同ID值的记录。

LEFT JOIN表示显示左表中的所有记录(即SQL语句之前的记录),无论右表中是否存在匹配记录。

尝试LEFT加入而不是INNER JOIN

SELECT DISTINCT i.id, i.date  
FROM `tblinvoices` i
LEFT JOIN `tblinvoiceitems`  it ON it.userid=i.userid
LEFT JOIN `tblcustomfieldsvalues`  cf ON it.relid=cf.relid  
WHERE i.`tax` = 0  
AND i.`date`  BETWEEN  '2012-07-01' AND '2012-09-31'