2016-05-11 11 views
0

いくつかの条件でLEFT JOINクエリを作成しようとしていますが、それは不思議なことです。LEFT JOIN条件は結果に影響しません。

SELECT c.country_id, c.country_name, IFNULL(MAX(b.bid_amount),0) 
FROM countries AS c 
LEFT JOIN items_bids AS b 
ON c.country_id = b.bid_country_id 
AND b.bid_removed = 0 
LEFT JOIN advertisers AS a 
ON a.advertiser_id = b.bid_advertiser_id 
AND a.advertiser_balance > 0 
AND a.advertiser_review = 0 
LEFT JOIN items AS n 
ON b.bid_item_id = n.item_id 
AND n.item_approved = 1 
AND n.item_deleted = 0 
AND n.item_paused = 0 
GROUP BY c.country_name 

それは、これと同じ結果を持っている:それは、ON句の条件のいずれかによって作用されていない

SELECT c.country_id, c.country_name, IFNULL(MAX(b.bid_amount),0) 
FROM countries AS c 
LEFT JOIN items_bids AS b 
ON c.country_id = b.bid_country_id 
LEFT JOIN advertisers AS a 
ON a.advertiser_id = b.bid_advertiser_id 
LEFT JOIN items AS n 
ON b.bid_item_id = n.item_id 
GROUP BY c.country_name 

私はそれは、異なる結果でなければなりません確信しているかの理由私はこれらの条件をON節の代わりにWHERE節に入れます。これは効果があります。

私は左のジョインを使用しています。なぜなら、結果から国を削除したくないからです。

+1

を試してみてください、あなたは、予想される結果とのデータの小さなサンプルを含めることはできますか? –

答えて

0

on - 条件がleft joinを使用してテーブルを結合し、その後それらを使用して効果がないため、期待どおりに動作しません。 max(b.bid_amount)countriesのみを使用するので、bcountriesの条件がここで有効になります。

例えば、advertisersのためのいくつかの行は、それがあなたのon -conditionを果たす存在する場合、それらが結合されていますが、それらを使用していないので、(彼らはしかし、例えばcount(*)またはsum(b.bid_amount)に影響を持っているでしょう)b.bid_amountに影響を与えません。 advertisersの行が存在しない場合は、left joinのために、どちらもb.bid_amountには影響しません。あなたの条件が何であるかは関係ありません。

あなたの最初のコードは

SELECT c.country_id, c.country_name, IFNULL(MAX(b.bid_amount),0) 
FROM countries AS c 
LEFT JOIN items_bids AS b 
ON c.country_id = b.bid_country_id 
AND b.bid_removed = 0 
GROUP BY c.country_name 

と同等で、2番目のコードが

SELECT c.country_id, c.country_name, IFNULL(MAX(b.bid_amount),0) 
FROM countries AS c 
LEFT JOIN items_bids AS b 
ON c.country_id = b.bid_country_id 
GROUP BY c.country_name 

に相当し、彼らが同じ結果を与えることは驚くべきことではないかもしれません( 自分のデータに依存し、どのくらいの行にb.bid_removed = 0があるか試してみてください。b.bid_removed = 1を試してみてください。これは唯一の関連条件です。

AND a.advertiser_balance > 0whereの場合、mysqlはa.advertiser_balanceがnullでない行のみを選択します。したがって、あなたのleft joinjoinのようになります。そして、これはそれほど驚くべきことではありません。

あなたが実際に達成したかったことを記述していないので、私は野生の推測を取り、いくつかの左の結合を削除します。あなたはすべての国を取得し、あなたのonすべての条件が動作します。

SELECT c.country_id, c.country_name, IFNULL(MAX(b.bid_amount),0) 
FROM countries AS c 
LEFT JOIN items_bids AS b 
ON c.country_id = b.bid_country_id 
AND b.bid_removed = 0 
JOIN advertisers AS a 
ON a.advertiser_id = b.bid_advertiser_id 
AND a.advertiser_balance > 0 
AND a.advertiser_review = 0 
JOIN items AS n 
ON b.bid_item_id = n.item_id 
AND n.item_approved = 1 
AND n.item_deleted = 0 
AND n.item_paused = 0 
GROUP BY c.country_name 
関連する問題