gpt4 book ai didi

使用子选择与值列表的 MySQL IN 子句

转载 作者:可可西里 更新时间:2023-11-01 08:20:01 26 4
gpt4 key购买 nike

我需要对一些相关数据进行两级过滤。第一个查询类似于:

SELECT t1.fk_id 
FROM t1
LEFT JOIN t3 ON t3.fk_id = t1.fk_id
WHERE t1.field1 > 10 AND t3.field2 = Y

第二个查询针对具有相同 fk_id 字段的另一个表运行,看起来像

SELECT t2.fk_id, SUM(t2.field3) AS sum_3, SUM(t2.field_4) AS sum_4 
FROM t2
WHERE fk_id IN (fk_values_from_query_1)
GROUP BY t2.fk_id
HAVING sum_3 > 1000

现在,据我所知,我可以运行这 2 种不同的方式 - 虽然我不受任何一种方法的束缚,但也可以使用其他方法。我可以将第一个查询作为 SUB-SELECT 嵌入到第二个查询中,据我所知,从性能的角度来看,这确实很糟糕。或者,我可以从查询 1 的结果中提取值,并将它们作为列表嵌入查询 2(在我的应用程序代码中)。

这个问题的两个部分是:

  1. 上述 2 种查询结构在性能方面是否存在差异?
  2. 是否有更好的方法来构造这 2 个查询?

基准

我没有对此进行全面测试,但针对我的数据运行了我的版本和 Barmar 发布的版本。我的查询运行大约需要 4.23 秒,而 Barmar 的版本只需要 0.60 秒即可运行。这是 85% 的改进!

最佳答案

您应该使用 JOIN 组合它们:

SELECT t2.fk_id, SUM(t2.field3) AS sum_3, SUM(t2.field_4) AS sum_4 
FROM t2
JOIN (SELECT distinct t1.fk_id
FROM t1
JOIN t2 ON t3.fk_id = t1.fk_id
WHERE t1.field1 > 10 AND t3.field2 = 'Y') t4
ON t2.fk_id = t4.fk_id
GROUP BY t2.fk_id
HAVING sum_3 > 1000

我一直发现,与类似的连接相比,MySQL 在 WHERE col IN (subquery) 查询上的表现非常糟糕。我没有将它与我从子查询中替换值的查询进行比较,因为我只在无法在单个查询中执行此操作时才这样做(例如,我需要匹配不同服务器上的数据)。

顺便说一句,如果您还对要连接的表中的值进行过滤,那么使用 LEFT JOIN 是没有意义的。

在所有情况下,请确保您在连接或 IN 子句中使用的键上有索引。

关于使用子选择与值列表的 MySQL IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com