SQL将行数从第二个表计数到主查询

时间:2013-06-14 09:39:28

标签: mysql sql

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

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

任何人都知道如何实现这一目标?

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 BYCOUNT(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