mysql - 在 MySQL 中对另一个子查询的结果执行子查询?

标签 mysql performance subquery

假设有一个表 Product,列为 prod_id, a, b

假设有一个表 Warehouse,列为 w_id, pid, amount

关键是连接这两个表,这样我们就可以得到结果列 prod_id, a, b, total(这是 amount 的总和 pid = prod_id)

目前我有这个查询:

SELECT
    t1.prod_id, a, b, c AS total
FROM
(
    SELECT prod_id, a, b
    FROM product
    WHERE ean = "3165142644363"
) t1
LEFT JOIN
(
    SELECT warehouse.pid, SUM(amount) AS c
    FROM warehouse
    WHERE warehouse.pid IN (SELECT prod_id FROM product WHERE ean = "3165142644363")
    GROUP BY warehouse.pid
) t2
    ON t2.pid = t1.prod_id

现在您看到有两个相似但不相同的查询:

SELECT prod_id, a, b FROM product WHERE ean = "3165142644363"

SELECT prod_id FROM product WHERE ean = "3165142644363"

执行这两个查询需要太多时间。有没有办法只执行第一个,然后从该子查询的结果中选择产品 ID?或任何其他重写查询的有效方法。创建 View 不是一个选项,因为可能有许多查询都具有不同的 ean 参数。查询为同一 ean

返回多行数据

最佳答案

我认为您可以删除出现在 WHERE ... IN 之后的子查询:

SELECT
    t1.prod_id, a, b, c AS total
FROM
(
    SELECT prod_id, a, b
    FROM product
    WHERE ean = '3165142644363'
) t1
LEFT JOIN
(
    SELECT warehouse.pid, SUM(amount) AS c
    FROM warehouse
    GROUP BY warehouse.pid
) t2
    ON t2.pid = t1.prod_id

您可以删除它的原因是 t2 子查询只包含出现在 t1 子查询中的 pid 值。否则,总和 c 在左连接之后无论如何都将为零。左连接已经隐式处理了 product 中的记录可能不会连接到 t2 子查询中的任何内容的情况。

也就是说,删除 WHERE ... IN 子查询可能不会提高性能那么多,因为它无论如何都不相关。优化器很可能只需要计算一次并将其缓存在某个地方。

关于mysql - 在 MySQL 中对另一个子查询的结果执行子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460125/

相关文章:

mysql - 为什么 MySQL 全外连接返回空值?

php - 如果mysql表中user_id不存在,如何插入新数据

java - “共享对象内存”与 'Heap Memory' - Java

mysql - 删除 MySQL 中的重复行

mysql - sql更新where子查询

mysql - 困境: Cascade delete or Join delete

mysql - 在 JQuery onchange 文本字段中获取数据库数据

C# 动态关键字——运行时惩罚?

c# - 与数组相比,使用 IEnumerable 有哪些优势?

如果子查询返回null,Mysql返回null