是否可以基于“ IF”语句在SELECT列之间进行更改?

时间:2019-05-05 09:40:03

标签: mysql mysql-if

我有一个'mapped_products'表:

  

product_id |价格

“ product_id_to_name”表:

  

product_id | product_name

(请不要问我为什么,这是我正在开发的已经构建的网络应用程序)。

“ non_mapped_products”表:

  

product_id |产品名称

和“ orders_history”表:

  

prodeuct_id | order_date

我的任务,以获得先前已订购的“ product_names”列表(通过检查“ orders_hisoty”表)。 这是针对这种情况的查询:

SELECT `non_mapped_products`.`product_name` 
FROM `non_mapped_products`
WHERE EXISTS ( SELECT 1  FROM `orders_history` WHERE `orders_history`.`product_id` = `non_mapped_products`.`product_id`)

现在,我注意到我的“ mapped_products”表中的“ non_mapped_pruducts”具有相同的产品-相同的“ product_id”,不同的“ product_name”: 我想使用“ product_name”(如果存在于我的“ mapped_products”表中)而不是“ non_mapped_products”表中的表-如果不存在,我想使用“ non_mapped_products”中的当前“ product_name”

我不太确定如何编写这种查询,它看起来像带有内部连接(?)的select下的if / case语句

SELECT (IF 'mapped_products'.'product_id' USE 'product_id_to_name'.'product_name' ELSE `non_mapped_products`.`product_name` ) 
FROM `non_mapped_products`
WHERE EXISTS ( SELECT 1  FROM `orders_history` WHERE `orders_history`.`product_id` = `non_mapped_products`.`product_id`)

我将编辑我的帖子,并添加一些错误的示例,这些示例我无法使用。

使用MySQL数据库。

SELECT

    CASE
        WHEN mapped_products.product_id = non_mapped_products.product_id
        THEN product_id_to_name.product_name
    ELSE
        non_mapped_products.product_name
    END
        AS product_name

FROM non_mapped_products

INNER JOIN mapped_products
    ON mapped_products.product_id = non_mapped_products.product_id
INNER JOIN product_id_to_name
    ON product_id_to_name.product_id = mapped_products.product_id

WHERE EXISTS ( SELECT 1  FROM orders_history WHERE orders_history.product_id = non_mapped_products.product_id)

返回: 仅在mapped_products表中重复产品名称

2 个答案:

答案 0 :(得分:1)

如果您将两个产品名称表LEFT JOIN到订单历史记录表(或提供product_id的任何其他表)中,则可以访问这两个可能的名称。然后,您可以使用COALESCE()函数从两个名称列中获取第一个非空值。您可能需要为此创建一个VIEW,以使其他查询的生活更加便捷。

答案 1 :(得分:0)

这应该有效。它有点长,但足够简单以通读:

TL; DR:

SELECT orders_history.product_id, product_id_to_name.product_name
FROM orders_history 
JOIN product_id_to_name ON orders_history.product_id = product_id_to_name.product_id 
UNION SELECT orders_history.product_id, non_mapped_products.product_name
FROM orders_history JOIN non_mapped_products ON orders_history.product_id = non_mapped_products.product_id
WHERE non_mapped_products.product_id NOT IN (SELECT product_id FROM product_id_to_name WHERE 1)

仔细阅读以下声明:

SELECT orders_history.product_id, product_id_to_name.product_name
FROM orders_history 
JOIN product_id_to_name ON orders_history.product_id = product_id_to_name.product_id

这将返回所有product_id_to_name.product_name值(根据OP您的首选默认名称)以及相关的顺序。

第二部分:

UNION SELECT orders_history.product_id, non_mapped_products.product_name
FROM orders_history JOIN non_mapped_products ON orders_history.product_id = non_mapped_products.product_id
WHERE non_mapped_products.product_id 
NOT IN (SELECT product_id FROM product_id_to_name WHERE 1)

这将前面语句的结果与选择{{1}中不存在non_mapped_products.product_name的{​​{1}}相结合。

最终结果是所有non_mapped_product.product_id字段以及最好从product_id_to_name.product_id中选择的order_history.product_id,但回退到product_name的值。