2012-10-12 24 views
0

我試圖找出爲什麼以下兩個查詢返回不同的結果: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

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' 
2

INNER JOIN手段只顯示記錄,其中兩個表中存在相同的ID值。

左連接意味着顯示左表中的所有記錄(即前面的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' 
+0

我已經回答了類似的問題昨天 –