sql—保留更改记录的最新记录

0sgqnhkj  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(527)

我有一份学生和他们的科目清单:

id | student | subject
---|---------|--------
1  | adam    | math
2  | bob     | english
3  | charlie | math
4  | dan     | english
5  | erik    | math

我从上面的列表中创建一个统计表,汇总每个科目有多少学生:

id | subject | students
---|---------|--------
1  | math    | 3
2  | english | 2

学生名单将继续扩大,这种聚合将定期进行。
我之所以将计数保存在一个单独的表中,首先是因为原始表应该是大量的(这只是我原始问题的一个简化),因此动态查询原始表以获取当前计数是不可行的。
总之,只要学生们不改变他们的主题,聚合是相当直接的。
但现在我想增加一个功能,让学生改变他们的主题。
我以前的方法是:在更新计数时,我保持 counter 我已经考虑到了哪一排学生。下次我只考虑在那一行之后添加的记录。
这也是我保持沉默的原因 counter 因为students表很大,我不想每次都扫描整个表,因为它的伸缩性不好。
如果所有的学生都是独一无二的,没有人改变他们的主题,那就很好了。
但它现在崩溃了,因为我无法再解释出现在计数器前面并被更新的行。
我的第二种方法是使用 updated_at 字段(而不是 counter )并以这种方式跟踪新修改的行。
但我仍然不知道如何准确地更新记录。
比如说,埃里克在上面的场景中把他的科目从“数学”改为“英语”。当我运行脚本来更新计数时,虽然它确实会找到新更新的行,但它只是说 {"erik": "english"} . 我怎么知道它是怎么变的?我需要知道这一点,以正确减少“数学”在理货表,而增加“英语”。
有办法解决吗?
为了再次总结我的问题,我想找到一种方法,能够用student表中更新/修改的行准确地更新计数表(一个按固定间隔运行的进程)。
如果有必要的话,我会使用nodejs和postgresql。

imzjd6km

imzjd6km1#

当学生添加主题、删除主题或更改主题时,为什么不这样做呢。
当学生增加新科目时:只需增加 UPDATE tbl_tally SET student = student + 1 WHERE subject = :subject ;
当学生移除主题时:只是减少 UPDATE tbl_tally SET student = student - 1 WHERE subject = :subject ;
当学生更换科目时:只需增加一个新科目,减少一个旧科目 UPDATE tbl_tally SET student = student - 1 WHERE subject = :old_subject ; UPDATE tbl_tally SET student = student + 1 WHERE subject = :new_subject ;
我不熟悉postgresql,但在mysql中,您甚至可以使用trigger。我认为postgresql也有触发器。

相关问题