Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中对另一个子查询的结果执行子查询?_Mysql_Performance_Subquery - Fatal编程技术网

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

在MySQL中对另一个子查询的结果执行子查询?,mysql,performance,subquery,Mysql,Performance,Subquery,假设有一个表Product,其列为prod_id、a、b 假设有一个带有w_id、pid、amount列的表仓库 关键是连接这两个表,这样我们就可以得到结果列prod_id,a,b,total,它是pid=prod_id的数量之和 目前我有以下问题: SELECT t1.prod_id, a, b, c AS total FROM ( SELECT prod_id, a, b FROM product WHERE ean = "3165142644363" ) t

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

假设有一个带有w_id、pid、amount列的表仓库

关键是连接这两个表,这样我们就可以得到结果列prod_id,a,b,total,它是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?或者任何其他重写查询的有效方法。创建视图不是一个选项,因为可能有许多查询都使用不同的ean参数。查询为同一个ean返回多行数据

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

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


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

最终自己找到了解决方案。比我想象的要容易得多:

SELECT pid, a, b, SUM(amount) AS total
FROM product
LEFT JOIN warehouse USING(pid)
WHERE ean = "3165142644363"
GROUP BY pid

在我的示例中,有列prod_id和pid,但实际上这两个表中都是pid

SELECT  pid, a, b, 
        ( SELECT  SUM(amount)
            FROM  wherehouse
            WHERE  pid = product.prod_id 
        ) AS total
    FROM  product
    WHERE  ean = "3165142644363";
带索引:

product: INDEX(ean)
wherehouse: INDEX(pid, amount)  -- in this order

您的查询在我的表中执行大约需要20秒。最终,我找到了答案,没有使用join进行澄清:我对同一个表的原始查询花费了大约11秒,因此效率没有提高improved@Alvis在产品表的ean列上有索引吗?有索引。无论如何,我找到了一种简化查询的方法,现在执行起来需要0016秒,请检查我对这个问题的回答。只有当pid是产品表上的主键时,此查询才有效。如果不是,那么您的查询要么不会运行,要么会给出不确定的结果。在任何情况下,+1表示查看简单解决方案。pid是产品表中的主要查询。对不起,我没提
product: INDEX(ean)
wherehouse: INDEX(pid, amount)  -- in this order