我想弄清楚为什么以下两个查询会返回不同的结果:
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'
但是因为当我添加内部联接时它看起来不正确的结果不同(它会删除一些应该有效的结果),所以它目前无效,谢谢。
答案 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'