0

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

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'  

但是由于当我添加内部连接时看起来不正确的不同结果(它删除了一些应该有效的结果)它目前无法正常工作,谢谢。

4

2 回答 2

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'  
于 2012-10-12T09:34:57.257 回答
2

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

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

尝试 LEFT Join 而不是 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'  
于 2012-10-12T10:07:33.433 回答