mysql - 在另一个子查询的 WHERE IN 中使用子查询结果(优化)

标签 mysql optimization

这已经困扰我一段时间了,作为一个新手,我不确定我到底应该寻找什么。经过几个小时的谷歌搜索后,我无法找到满意的答案。

我有一个相对复杂的查询,我已将其剥离并简化为:

SELECT field_a1,
       field_a2,
       (SELECT Count(*)
        FROM   table_b
        WHERE  field_b1 IN (SELECT field_x1
                            FROM   table_x) AND field_b2 = 1) AS new_field_1,
       (SELECT Count(*)
        FROM   table_c
        WHERE  field_c1 IN (SELECT field_x1
                            FROM   table_x) AND field_c2 = 2) AS new_field_2,
       (SELECT Count(*)
        FROM   table_d
        WHERE  field_d1 IN (SELECT field_x1
                            FROM   table_x) AND field_d2 = 3) AS new_field_3
FROM   table_a
WHERE  field_a1 IN (SELECT field_x1
                    FROM   table_x)

在原始查询中,我有大约 30 个 new_field_*。一切似乎都运行良好,我得到了一些非常令人满意的结果(最终结果和性能)。

我的问题是这个查询:

SELECT field_x1
FROM   table_x

重复相当多的次数(30 * 返回的行数),并且始终用作 WHERE IN 将在其中查找匹配项的集合。

我的问题:

是否可以只执行一次这个小查询并保留该结果并重复使用它?

我能想到的唯一两件事(荒谬的)是这样的(想象中的解决方案):

temp = (SELECT field_x1
        FROM   table_x)
SELECT field_1
FROM   table_1
WHERE  field_1 IN temp

或者在客户端(运行 PHP 的网络服务器)执行一次此查询,然后使用如下方式将结果附加到将来的查询中:

$IN_Condition = implode(',', $stmt->execute()->fetchAll(PDO::FETCH_NUM));
$sql_query = "SELECT field_1
              FROM   table_1
              WHERE  field_1 IN ($IN_Condition)"

最佳答案

尝试使用 JOIN 子句,例如-

已编辑:

SELECT
  field_a1,
  COUNT(b.field_b1) new_field_1,
  COUNT(c.field_c1) new_field_2,
  COUNT(d.field_d1) new_field_3
FROM
  table_a a
JOIN table_x x
  ON x.field_x1 = a.field_a1
LEFT JOIN table_b b
  ON b.field_b1 = x.field_x1
LEFT JOIN table_c c
  ON c.field_c1 = x.field_x1
LEFT JOIN table_d d
  ON d.field_d1 = x.field_x1
GROUP BY
  a.field_a1

关于mysql - 在另一个子查询的 WHERE IN 中使用子查询结果(优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11289385/

相关文章:

mysql - 灵活的事务查询不会被回滚

C# - 应用程序内存问题

algorithm - 列表理解或顺序过滤器是否更优化?

mysql - 首先按用户排序数据库结果集,然后按日期排序

MySQL 自动增量不适用于 INT(12)

php - 使用 $_POST 从 Select 语句设置文本框值?

java - 像 JMeter 这样的程序可以测量 Java 套接字上每秒的事务数?

c - C 从 8 个不同字节中提取 8 位的最快方法是什么?

java - 大输入上的慢速字符串连接

c# - MySql.Data.MySqlClient.MySqlException'发生在MySql.Data.dll中