sql 语句问题

表A 有 id name 字段
表B 有 id a_id 字段
a表与B表是1对多的关系
现在想在A表里加一个总数字段 c
把B表里相同a_id字段的数据总和放入 A表的c字段,语句该怎么写,以前我是连表查询 但是这样太慢了。
这个是以前的sql语句

select A.*,count(B.id) as c from A left JOIN B ON A.id = B.a_id  GROUP BY A.id
阅读 3.8k
4 个回答

尝试别用sql语言写,随便用php python之类的跑,如果数据量还可以的话,应该比纯sql解决问题更有效率的.
或者你尝试生成中间表.通过中间表做一次

首先对于优化类的问题你一定要贴出索引结构,表数据的多少,存储引擎等等相关信息
目测你是innodb引擎吧?表A中存储了字段总数c,那么c这个字段是个大字段列吧?,对于使用聚集索引innodb来说肯定是慢的。

以下解决办法针对上面的假设情况:
1.换存储引擎,换成myisam
2.不换引擎,那么不要group by id(即主键),你group by一个非主键索引

再给个推荐:
把那个新加的字段单独存放一张表(不要让这个大数据字段影响其他数据查询),但是这必须和第二条结果配合着用
你可以先试试,有疑问再追问.

用程序脚本查询
先在表B里面查询:
select a_id count(id) as aIdCnt from 表B group by id;
得到字段总和,
然后根据 a_id => aIdCnt ,去更新表A

UPDATE a AS main 
  SET main.count = (
    SELECT 
      count(*) 
    FROM b AS sub 
    WHERE sub.a_id = main.id
  );
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题