2016-05-11 122 views
0

我试图用一些条件创建一个左连接查询,但它似乎很奇怪。左连接条件不影响结果

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 

我敢肯定,这应该是一个不同的结果,因为如果我把这些条件放在WHERE子句中,而不是ON子句,它确实有效。

问题是,我正在使用LEFT JOIN,因为我不想从结果中消除任何国家。

+1

您可以包括与预期结果数据的小样本? –

回答

0

您的on-条件不按预期工作,因为您使用left join连接表,然后从不使用它们,因此它们不起作用。您只使用max(b.bid_amount)countries,因此只有在bcountries的条件才会生效。

例如,如果某些行的advertisers存在即满足您的on -condition,它们结合,但对b.bid_amount没有影响,因为你不使用它们(他们会对例如count(*)sum(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 

和你的第二个代码相当于

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 > 0,mysql只会选择a.advertiser_balance不为空的行!所以你的left join将作为join,并不奇怪,这可能会有不同的结果。

由于您没有描述您实际想要达到的目标,我会大胆猜测并删除一些左连接。您将获得所有国家,并且您的所有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