0

次の 2 つのクエリが異なる結果を返す理由を解明しようとしています。

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ステートメントの両方のテーブルに格納されている行を取得します。LEFTJOINステートメントを試してください。これにより、最初のテーブルにはあるが2番目のテーブルには必要のない行が返されます。

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 ステートメントで先行するもの) のすべてのレコードを表示することを意味します。

INNER JOIN の代わりに 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-12T10:07:33.433 に答える