在常用的 分类表 详情表 1对多模型中,常常有统计某个分类下有多少详情数据的,比如 某分类下有多少文章,分类表往往数据量少,可能就只有几十条几百条,但是详情表会很多,几十万 上百万都有可能,那么在某些详情分类得到变更的情况下,或者说新增删除了某个详情记录,分类的统计记录又该如何统计呢?

我们这里先展示一下常用的分类详情设计

分类表

详情表

这是最简单不过的1对多了,一条新闻属于某个分类下,然后我们想统计某个分类下有多少文章,如何统计呢?

当然了,其实我们在web应用中往往希望看到分类名称,以及该分类下的新闻数量,那么这个统计结果还是有些不太如意的,如何处理呢?

这才是我们希望看到的结果,有分类名称,有对应该分类下统计数量

甚至还可以这样写

不过这样写在有些SQL_MODE下好像不太支持 会提示这个name isn't in GROUP BY

因为你查询的那个字段不在分组的字段里面,所以会提示你这样的SQL错误。但是无论怎样都避免不了联表了,如何不联表而且能查询到我们想要的结果呢?

我们这里举个例子,通过分别查询,并进行键值组合得到结果

代码如下:

结果如下:

这样是通过PHP对数据进行处理得到的结果。

那么这样的情况是通过数据库的统计而得到的结果,如果有些时候不方便这样每次统计又该如何做呢?

那我们已经想到了,将统计数量先缓存起来,只有在新增和删除或者被修改的时候才更新缓存,就能拿到统计数量了。

我们可以采用很多种缓存,文件 Redis memcache等等,不过这里可以简单的用数据库添加字段冗余来缓存。我们将cat表改造一下

字段添加了以后 数据是空的

得想办法把news详情表中的统计数量同步过来,那么如何同步呢?

我们可以用查询   select cat_id,count(id) as num from news group by cat_id;  的结果来循环更新进行同步,这是最直接最直观的方法

结果如图:

查看数据库:

这是先统计结果,然后循环更新的方法,当然也可以想办法进行join同步

update
cat left join (select cat_id,count(*) as count_num from news group by cat_id) as tmp
on tmp.cat_id=cat.id
set cat.num=tmp.count_num;

这样数据就同步过来了。

当news详情表有新增和删除的时候,这个cat表里的num就要同步的加1或者减1,当news详情表里面的cat_id被修改的时候,cat表里面的num就要相对应的同步修改之前的cat_id的num和修改之后的cat_id的num。

描述起来有些复杂,不如用代码演示一遍

当前数据库

代码如下:

结果如下:

数据库如图:

其实这里的SQL语句也可以用  select count(*) from news where cat_id=2 先统计出来 然后PHP计算统计数量+1之后,再  update cat set num=计算增加后的数量 where id=$cat_id  这样更新

但是为什么不用呢??? 请自行结合实际业务仔细思考或者给我留言。

那么相对应的,如果有人删除了某条详情,cat表里的num就要减1

具体如下:

当前数据库:

代码如下:

结果如图:

数据库如图:

我们可以看到,删除详情表,需要先检查详情是否存在,存在的话获取详情的cat_id,删除详情后针对该cat_id进行减1操作

增加和删除都是对单条记录受到影响,如果是修改则不一样了,因为修改意味着当前分类的num-1,修改后的分类的num+1 ,此消彼长的概念便油然而生!

当前数据库如下:

代码如下:

结果如下:

数据库如图:

这样就实现了旧分类减1,新分类加1的功能。

采用MySQL的字段冗余做缓存,虽然查询起来更方便了,可是维护起来也更加复杂了。

这往往是我们实际业务开发中需要抉择的,冗余多了,查询方便,可是维护的力度也变大了,冗余少,范式高,查询起来也复杂了,还是要适当冗余的好,毕竟目前大部分公司的业务中的查询和修改所占比例中,查询还是多一些的,用nosql做缓存的话也是很方便的,能够键值对直接修改,没有SQL这么复杂,维护力度也会稍微降低一点点,不过总体的设计上还是差别不大,具体选用哪种方式还要看我们所负责的业务和场景需要什么模型去融合去实现。

转载于:https://www.cnblogs.com/lizhaoyao/p/7660819.html

如何实现分类表统计数目和详情表数量同步相关推荐

  1. php 中间表统计,多对多中间表详解

    我们都知道对于ManyToMany字段,Django采用的是第三张中间表的方式.通过这第三张表,来关联ManyToMany的双方.下面我们根据一个具体的例子,详细解说中间表的使用. 一.默认中间表 首 ...

  2. VBA小模板,跨表统计的2种写法

    问题和目标 问题: 是想统计一个excel 文件里,多个sheet里的内容 但是整个目标可以细化为不同的分支需求 有的统计需求是,每个表只单表统计,只是进行批量操作.比如例子里累加到每个sheet的指 ...

  3. EXCEL函数篇 跨工作表统计数据

    多工作表统计 1.多工作表统计求和 对于多个表的数求和汇总,可以SUMIF()函数 语法:SUMIF(区域,条件,[求和区域]) 1.1. 表名无规律 SUMIF+SUMIF()+SUMIF()+SU ...

  4. 实时用户在线人数统计(一):表统计

    在项目中有时候需要统计实时在线人数,在我过往的项目中,主要实施过以下几种方案,现在一一来说明下: 1)表统计:用数据表统计在线人数,缺点是当并发量大的时候可能造成性能瓶颈,如无特别大的并发的时候完全可 ...

  5. python 频数统计_日常答疑:Python实现分类频数统计

    原标题:日常答疑:Python实现分类频数统计 点击上图,查看教学大纲 问题 群友提问:求每组数据中每个元素重复的个数,用什么函数? 严小样儿:安排! 咋一看,我觉得他问的我很懵B~于是,和他要了份数 ...

  6. 计算机应用专业成绩汇总表,计算机应用基础第7章Excel综合应用1—成绩表统计与分析.ppt...

    计算机应用基础第7章Excel综合应用1-成绩表统计与分析 第7章 Excel综合应用1-成绩表统计与分析 计算机应用基础 主编:许晞 副主编:刘艳丽 曾煌兴 郑杰 秦高德 学习目标 熟练掌握统计函数 ...

  7. excel数值分类汇总+分段统计:数据透视表

    一.已有数据:如下图所示的一列数字. 二.问题: 1)统计每一个数字的个数: 2)统计分段范围内数字的个数. 三.解决方式 问题1 (1)首先需要给要统计的该列数值加上字段名(即列名,此处命名为值), ...

  8. R语言使用两个分类变量创建双向表(Two Way Table、两个分类变量的频率表)实战: 矩阵的双向表、dataframe的双向表、条形图和马赛克图来可视化频率表

    R语言使用两个分类变量创建双向表(Two Way Table.两个分类变量的频率表)实战: 矩阵的双向表.dataframe的双向表.条形图和马赛克图来可视化频率表 目录

  9. SQL调优--记一次表统计信息未及时更新导致查询超级慢

                某日同事丢给我一个看上去复杂的查询(实际就涉及两张表,套来套去)说只是换了日期条件,但一个查询5秒出数据,一个根本查不出来.现在整理下解决过程,及涉及的知识点. 若有不正之处, ...

最新文章

  1. 2021年编程语言趋势预测:Python和JavaScript仍火热,Go不可小觑
  2. LNMP--Nginx的日志切割
  3. LeetCode算法题5:双指针
  4. VTK:参数样条用法实战
  5. LAMP或LNMP一键安装包
  6. aix系统下oracle之ora-00471,Oracle RAC 9.2.0.7 (AIX53,HA52)三台主机实例全down的问题
  7. Hadoop学习笔记目录
  8. 机器学习之Adaboost (自适应增强)算法
  9. Go 语言学习总结(7)—— 大厂 Go 编程规范总结
  10. python关键词对联_keras基于CNN和序列标注的对联机器人
  11. Linux rpm 命令参数使用详解[介绍和应用](转)
  12. Eclipse启动报错:A java runtime Environment(JRE) or java Development……的解决办法
  13. 2022-2027年中国缝制机械行业市场全景评估及发展战略规划报告
  14. STM32单片机实现二维码显示
  15. Deferred异步操作
  16. 从0开始搞一个锦鲤游动——动起来
  17. linux服务器配置免密登录方式(vscode 以及 MobaXterm 登录)
  18. 七夕礼物 | 全网最火的钉子绕线图制作教程
  19. 外地人,在上海报考驾照
  20. 视频教程-微信小程序项目实战之我画你猜视频课程-微信开发

热门文章

  1. 用 Go 构建一个区块链 -- Part 7: 网络
  2. How I Hacked 40 Websites in 7 minutes
  3. 基于mcat开发以太坊智能合约
  4. ART深度探索开篇:从Method Hook谈起
  5. Android Camera架构分析
  6. Android安全教程(1)---Fiddler简易使用教程之配置环境
  7. python查看图片的源代码_python获取图片元数据的代码
  8. 获取qt保存对话框中输入文本_PyQt5 输入对话框QInputDialog
  9. python实现udp聊天室_python网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序...
  10. BZOJ 3622 Luogu P4859 已经没有什么好害怕的了 (容斥原理、DP)