MySQL使用CASE WHEN和IN子查询

时间:2018-11-22 02:27:09

标签: mysql

这里是我要完成的任务的简要说明;我的查询如下。

我有两个表,一个表包含500个产品product_limit500,另一个表具有订单order_limit1000

我的目标是创建一个表,其中包含每个订单的所有500种产品,所有产品的顺序相同(如order one followed by all other products,然后是order two followed by the products in the same order)。

这是我尝试使用的查询。

SELECT 
  r1.order_id, 
  r1.product_id, 
  r1.product_name,
  CASE WHEN p1.product_id IN (SELECT 
                                r2.product_id 
                              FROM 
                                order_limit1000 r2 
                              WHERE 
                                r2.order_id = r1.order_id) THEN 's'
  ELSE '?'
  END as 'torf'
FROM 
  order_limit1000 r1, 
  product_limit500 p1;

这是目前的结果。

  order_id  product_id  product_name    torf
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  s
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  s
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  ?
   5    13176   Bag of Organic Bananas  s
   5    13176   Bag of Organic Bananas  ?
   ...

感谢您提供的任何帮助。

...

现在我正在使用一个包含500个products和1000行orders的视图,我仍在思考orders的最终大小,大概是500k到1mi行。但是我使用的数据集大约有4.5mi行。

预期结果将类似于以下内容。

 order_id   product_id  product_name    torf
    5           123        tomatoes      s
    5           124        limes         ?
    ...
    100         123        tomatoes      ?
    100         124        limes         ?

1 个答案:

答案 0 :(得分:1)

不要在表名之间使用逗号,当然也不要用逗号代替cross join。我不确定为什么要针对每个订单使用每种产品,但是要做到这一点,您确实需要完整的笛卡尔积,因此需要交叉连接。

SELECT
    r1.order_id
  , p1.product_id
  , p1.product_name
  , CASE
        WHEN r1.product_id = p1.product_id THEN 's'
        ELSE '?'
    END AS 'torf'
FROM order_limit1000 r1
CROSS JOIN product_limit500 p1
ORDER BY
    r1.order_id
  , p1.product_id
  , p1.product_name

鉴于订单表中已经有一个product_id,因此您不需要其他相关的子查询来测试是否应输出“ s”或“?”。 nb:我假设产品名称来自产品表,而不是订单表。

  order_id   R1.product_id   P1.product_id   product_name   torf  
 ---------- --------------- --------------- -------------- ------ 
         5             123             123   tomatoes       s     << r1.product_id = p1.product_id
         5                             124   limes          ?     
       ...                                                        
       100                             123   tomatoes       ?     
       100                             124   limes          ?