3

我正在尝试改进(不是那么多)简单查询:

  • 我需要从表 A 中检索每一行。
  • 然后将表 A 与表 B 连接起来,这样我就得到了我需要的所有数据。
  • 同时,我需要使用表 C 中的 count() 添加一个额外的列。

就像是:

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 个查询,我需要改进它,所以它只做一个(如果,它甚至可能的话)。

任何人都知道我怎样才能做到这一点?

4

2 回答 2

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 BYand相比,我的示例可能会显着减少读取次数COUNT(DISTINCT)

于 2013-06-14T10:11:33.223 回答
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
于 2013-06-14T09:42:31.330 回答