MySQL 使用 CASE WHEN 和 IN 子查询

标签 mysql

这是我想要实现的目标的简要说明;我的查询如下。

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

我的目标是创建一个表,其中包含每个订单的所有 500 种产品,所有产品的顺序相同(如 订单一后跟所有其他产品,然后订单二后跟相同订单中的产品)。

这是我尝试使用的查询。

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  ?
   ...

感谢您提供的任何帮助。

...

现在我使用的 View 包含 500 个产品和 1000 行订单,我仍在考虑订单的最终大小 code>,大概有 500k 到 1mi 行。但我使用的数据集有大约 4.5mi 的行。

预期结果如下所示。

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

最佳答案

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

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”或“?”。注意:我假设产品名称来自产品表,而不是订单表。

  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          ?     

关于MySQL 使用 CASE WHEN 和 IN 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53423063/

相关文章:

mysql - Symfony2多表连接问题

java - 我无法将结果集的值存储到二维字符串数组中

php - 当指针恰好位于 mysql_num_rows 的 1/2 时,mysql_fetch_array 返回 false

MySQL 更新行为

mysql计算不重叠的UNION结果

mysql - SELECT * FROM tablename ORDER BY LIMIT 不起作用

javascript - 如何使用 PHP 修改 JSON 中此 mySQL 查询的显示?

java - Openshift 在 JBoss AS7 上部署失败,MYSQL 依赖错误

mysql - 不存在的地方 -- 错误 1064 (42000) : You have an error in your SQL syntax; check

MySQL 查找两列之间缺失的组合