我有一个'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
表中重复产品名称
答案 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
的值。