2016-05-11 10 views
0

Ich versuche, eine LINKE JOIN-Abfrage mit einigen Bedingungen erstellen, aber es scheint seltsam zu handeln.LINKE JOIN-Bedingungen beeinflussen das Ergebnis nicht

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 

Es hat das gleiche Ergebnis wie folgt aus:: Es wird nicht durch eine der ON-Klausel Bedingungen beaufschlagt werden

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 

Ich bin sicher, es sollte ein anderes Ergebnis, denn wenn Ich setze diese Bedingungen in eine WHERE-Klausel statt einer ON-Klausel, es hat eine Wirkung.

Die Sache ist, ich benutze eine LINKE JOIN, weil ich keine Länder aus dem Ergebnis eliminieren möchte.

+1

Können Sie eine kleine Auswahl von Daten mit den erwarteten Ergebnissen gehören? –

Antwort

0

Ihre on-Bedingungen funktionieren nicht wie erwartet, weil Sie left join verwenden, um Tabellen beizutreten und sie dann nie zu verwenden, damit sie keine Wirkung haben. Sie verwenden nur max(b.bid_amount) und countries, daher wirken sich nur die Bedingungen auf b und countries aus.

Z. B. wenn einige Zeilen für advertisers existieren, erfüllen Ihre on -Bedingung, sie verbunden sind, haben aber keinen Einfluss auf b.bid_amount weil Sie sie nicht benutzen (sie hätte einen Effekt haben beispielsweise auf count(*) oder sum(b.bid_amount) obwohl). Wenn keine Zeilen für advertisers vorhanden sind, haben sie keine Auswirkungen auf b.bid_amount entweder wegen der left join. Es ist also egal, wie deine Bedingungen sind.

Ihr erster Code entspricht

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 

und Ihren zweiten Code entspricht

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 

und es vielleicht nicht überraschend sein, dass sie das gleiche Ergebnis (je nach Ihre Daten und Wie viele Zeilen haben b.bid_removed = 0. Versuchen Sie b.bid_removed = 1 und Sie könnten einen Effekt sehen, es ist die einzige relevante Bedingung).

Wenn Sie Ihre Bedingungen, z. AND a.advertiser_balance > 0 In einer where -Klausel wird mysql nur Zeilen auswählen, in denen a.advertiser_balance nicht null ist! Ihr left join wird als join fungieren, und es ist nicht so überraschend, dass dies ein anderes Ergebnis haben könnte.

Da Sie nicht beschreiben, was Sie eigentlich erreichen wollten, werde ich eine wilde Vermutung nehmen und einige linke Joins entfernen. Sie erhalten alle Länder und alle Ihre on-Bedingungen funktionieren.

Versuchen

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 
Verwandte Themen