【发布时间】:2021-08-15 09:20:31
【问题描述】:
我有两个相同的查询。我有一个案例,我想获取与集合相关的所有订单。我可以考虑使用 UNION,但它太慢了。
查询 1: 在这里,我尝试查询类型为 2 的订单,这意味着 ref_id 引用了一个变体。
orders -> order_items -> variants -> products -> lines -> collections
SELECT
`orders`.*
FROM
`orders`
LEFT JOIN `order_items` ON `orders`.`id` = `order_items`.`order_id`
LEFT JOIN `variants` ON `order_items`.`ref_id` = `variants`.`id`
LEFT JOIN `line_products` ON `variants`.`parent_id` = `line_products`.`product_id`
AND `order_items`.`type` = 2
LEFT JOIN `collection_line` ON `line_products`.`line_id` = `collection_line`.`line_id`
WHERE
`collection_line`.`collection_id` = 55;
查询 2: 在这里,我尝试查询项目类型为 1 的订单,这意味着 ref_id 正在引用产品。
订单 -> order_items -> 产品 -> 行 -> 集合
SELECT
`orders`.*
FROM
`orders`
LEFT JOIN `order_items` ON `orders`.`id` = `order_items`.`order_id`
LEFT JOIN `line_products` ON `order_items`.`ref_id` = `line_products`.`product_id`
AND `order_items`.`type` = 1
LEFT JOIN `collection_line` ON `line_products`.`line_id` = `collection_line`.`line_id`
WHERE
`collection_line`.`collection_id` = 55;
有没有办法可以组合和优化这两个查询?
【问题讨论】:
-
order_items.typeIN (2,1) -
将一列用于两个外键是糟糕的设计:使用单独的列。
-
您的最终连接是内部连接
-
1) 慢有多慢? 2) 你能否通过运行
SHOW CREATE TABLE table_name来更新你的问题与所有表定义。 3)每个表有多少(估计的)数据行? 4) 它已经被提及,但是当你做WHERE collection_line.collection_id=55;时,LEFT JOIN collection_line ..已经被转向INNER JOIN -
"combine" & "optimize" 没有特别的含义。 minimal reproducible example PS 了解子查询。 PS LEFT JOIN 返回由 NULL 扩展的 INNER JOIN 行 UNION ALL 不匹配的左表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 LEFT JOIN 之后,需要右 [sic] 表列不为 NULL 的 WHERE、INNER JOIN 或 HAVING 删除任何引入了 NULL 的行,即只留下 INNER JOIN 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。