mysql在子查询中的用法

z0qdvdin  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(321)

下面是我要完成的任务的简要说明;我的问题如下。
我有两张table,一张有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         ?
pn9klfpd

pn9klfpd1#

请不要在表名之间使用逗号,当然也不要用逗号代替 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

假定order表中已经有一个product\u id,您不需要另一个相关子查询来测试是否应该输出's'或'?'。注意:我假设产品名称来自产品表,而不是订单表。

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          ?

相关问题