这已经困扰我一段时间了,作为一个新手,我不确定我到底应该寻找什么。经过几个小时的谷歌搜索后,我无法找到满意的答案。
我有一个相对复杂的查询,我已将其剥离并简化为:
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/