无法编写关联两张表的SQL查询,求修正并实现更新功能
解决思路与正确SQL语句
先帮你梳理下原查询里的几个关键问题:
- 聚合函数是
COUNT(*)而非counter(*),拼写有误 - 关联条件写反了:应该是
p.topic_id = t.tid(posts表的外键是topic_id,对应topic表的tid) - 聚合后的别名
c不能在WHERE子句中使用,因为WHERE是在聚合计算前执行的,筛选聚合结果得用HAVING
1. 找出计数不符的tid及实际数量
先写一个查询,列出所有topic中存储的帖子数和posts表实际计数不符的记录:
SELECT t.tid, t.posts AS 存储的帖子数, COUNT(p.topic_id) AS 实际帖子数 FROM topic t LEFT JOIN posts p ON t.tid = p.topic_id GROUP BY t.tid, t.posts HAVING COUNT(p.topic_id) != t.posts
这里用LEFT JOIN是为了覆盖那些在topic表中存在,但posts表中没有对应记录的tid(此时实际计数为0);如果不需要这种情况,换成INNER JOIN即可。
2. 更新topic表的posts列为实际计数
如果要把topic表中所有tid的posts列更新为实际的帖子数,可以用子查询关联的方式:
UPDATE topic t SET posts = ( SELECT COUNT(*) FROM posts p WHERE p.topic_id = t.tid )
如果只想更新那些计数不符的行(更高效),可以用JOIN的方式:
UPDATE topic t JOIN ( SELECT topic_id, COUNT(*) AS actual_count FROM posts GROUP BY topic_id ) p ON t.tid = p.topic_id SET t.posts = p.actual_count WHERE t.posts != p.actual_count
这个语句会先统计posts表中每个topic_id的实际帖子数,然后和topic表关联,只更新存储值与实际值不符的行。
内容的提问来源于stack exchange,提问作者Dinesh G
相关产品推荐
相关产品推荐

