假设有一个表 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/