Mysql如果条件在INNER JOIN上

时间:2014-06-06 09:40:42

标签: mysql

以下请求为我提供了产品清单,销售产品的商店以及"父母"商店,我需要用于其他目的:

SELECT  `allproducts`.`id_store` ,  `uniques` . * 
FROM  `uniques` 
INNER JOIN  `allproducts` ON  `allproducts`.`SKU` =  `uniques`.`SKU` 

结果如下:

id_store SKU     id_parent name      sale_sdate  sale_edate
1085     100768  1088      productA  5/18/2014   6/14/2014
1088     100768  1088      productA  5/18/2014   6/14/2014
1089     100768  1088      productA  5/18/2014   6/14/2014

你可以看到,在第二行,id_store和id_parent是相同的(父商店也销售产品)。在这种情况下,我应该用0替换id_parent:

id_store SKU     id_parent name      sale_sdate  sale_edate
1085     100768  1088      productA  5/18/2014   6/14/2014
1088     100768  0         productA  5/18/2014   6/14/2014
1089     100768  1088      productA  5/18/2014   6/14/2014

我很难在这个大请求中集成IF条件(我可以在这里发布我尝试的所有内容但它可能会让事情变得非常混乱)。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

使用CASE。如果没有其他条件,请删除WHERE子句。

SELECT  `allproducts`.`id_store`, `uniques`.SKU,
        CASE WHEN `allproducts`.`id_store`=`uniques`.`id_parent` THEN 0 ELSE `uniques`.`id_parent` END as id_parent,  
        `uniques`.`name`,`uniques`.`sale_sdate`,`uniques`.`sale_edate`
FROM  `uniques` 
INNER JOIN  `allproducts` ON  `allproducts`.`SKU` =  `uniques`.`SKU` 

<强>解释

如果id_store等于id_parent,则会选择0.否则,它会选择id_parent本身。

修改

我想用别名重写您的查询以提高可读性。

SELECT  ap.`id_store`, u.SKU,
        CASE WHEN ap.`id_store`=u.`id_parent` THEN 0 ELSE u.`id_parent` END as id_parent,  
        u.`name`,u.`sale_sdate`,u.`sale_edate`
FROM  `uniques` u
INNER JOIN  `allproducts` ap ON  ap.`SKU` =  u.`SKU` 

答案 1 :(得分:1)

像这样使用if

SELECT  a.`id_store`, a.`SKU`,
IF (a.`id_store` = u.`id_store`, 0, u.id_store`) as `id_parent`,
u.`name`, u.`sale_sdate`, `u.sale_edate`
FROM  `uniques` u
INNER JOIN  `allproducts` a ON  u.`SKU` =  a.`SKU` 

由于您在WHERE子句中指定了要加入的字段,因此可以删除INNER JOIN子句。