我正在尝试改进(不是那么多)简单查询:
类似的东西:
SELECT a.*,
(SELECT Count(*)
FROM table_c c
WHERE c.a_id = a.id) AS counter,
b.*
FROM table_a a
LEFT JOIN table_b b
ON b.a_id = a.id
这很有效,但实际上,我只是进行了2次查询,我需要改进它,所以它只做一次(如果,甚至可能)。
任何人都知道如何实现这一目标?
答案 0 :(得分:3)
最简单的方法可能只是将相关的子查询移动到子查询中。
注意:许多优化工具非常有效地处理相关的子查询。您的示例查询可能非常合理。
SELECT
a.*,
b.*,
c.row_count
FROM
table_a a
LEFT JOIN
table_b b
ON b.a_id = a.id
LEFT JOIN
(
SELECT
a_id,
Count(*) row_count
FROM
table_c
GROUP BY
a_id
)
c
ON c.a_id = a.id
另一个注意: SQL是一个表达式,它不是直接执行的,它是使用嵌套循环,散列连接等转换成计划的。不要假设有两个查询是一件坏事。在这种情况下,我的示例可以显着减少与单个查询相比的读取次数,然后使用GROUP BY
和COUNT(DISTINCT)
。
答案 1 :(得分:0)
试试这个:
SELECT
tmp.*,
SUM(IF(c.a_id IS NULL,0,1)) as counter,
FROM (
SELECT
a.id as aid,
b.id as bid,
a.*,
b.*
FROM
table_a a
LEFT JOIN table_b b
ON b.a_id = a.id
) as tmp
LEFT JOIN table_c c
ON c.a_id = tmp.id
GROUP BY
tmp.aid,
tmp.bid