表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
表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
首先对于优化类的问题你一定要贴出索引结构,表数据的多少,存储引擎等等相关信息
目测你是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
);
1 回答2.5k 阅读✓ 已解决
5 回答1.5k 阅读
2 回答2.2k 阅读
3 回答694 阅读✓ 已解决
1 回答1.9k 阅读
1 回答1k 阅读
1 回答679 阅读✓ 已解决
尝试别用sql语言写,随便用php python之类的跑,如果数据量还可以的话,应该比纯sql解决问题更有效率的.
或者你尝试生成中间表.通过中间表做一次