加入有条件的表

时间:2012-01-02 10:53:06

标签: mysql

表格加入时遇到问题。

我有两个表:product_commons和product_prices。 Product_prices包含标准产品价格+预先生成的广告系列价格(campaign_id)的记录。我需要一个查询,它会返回包含广告系列价格(如果存在)或标准价格(如果不存在)的产品列表。

这样的事情:

SELECT * FROM product_commons 
   INNER JOIN product_prices ON product_commons.id = product_prices.product_id 
WHERE (campaign_id = 3 OR campaign_id IS NULL) 
GROUP BY product_commons.id

不幸的是,此查询只返回campaign_id = NULL的价格。

3 个答案:

答案 0 :(得分:2)

您需要在COALESCE中混合使用INNER和LEFT(OUTER)JOIN,并在JOIN条件中使用campaign_id过滤器。要将不同行中的2个价格分成一行,您需要2个JOIN。

SELECT
   *,
   COALESEC(pstd.price, pc.price)
FROM 
   product_commons pc
   JOIN
   product_prices pstd ON pc.id = pstd.product_id AND pstd.campaign_id IS NULL;
   LEFT JOIN 
   product_prices pp ON pc.id = pp.product_id AND pp.campaign_id = 3;

您也不需要GROUP BY:它在标准SQL或其他RDBMS中没有意义(并且会像这样使用错误)

答案 1 :(得分:1)

由于您要查找广告系列价格和默认价格的不同价格行,因此您需要两个连接:一个用于默认价格(内部,因为默认值始终存在)和一个用于广告系列#3价格(外部,因为它可能不存在)。 COALESCE返回第一个操作数,如果它不为null;否则,它返回第二个操作数。

SELECT *,COALESCE(c3_price.price,def_price.price)
FROM product_commons
LEFT OUTER JOIN product_prices c3_price ON product_commons.id = c3_price.product_id and c3_price.campaign_id = 3
INNER JOIN product_prices def_price ON product_commons.id = def_price.product_id and def_price.campaign_id IS NULL

答案 2 :(得分:0)

使用左连接

Select *  FROM product_commons LEFT JOIN product_prices ON product_commons.id = product_prices.product_id  WHERE (campaign_id = 3 OR campaign_id IS NULL)