我刚刚开始学习MySQL和关系型数据库.我决定试着为自己建立一个非常简单的日常习惯跟踪db/app,作为这个过程的一部分.我已经取得了进步,这在很大程度上要归功于这里所有的伟大信息,但我一直未能弄清楚这一点.这是我的两张桌子.

habit_log

| id | date  | daily_habit_text | daily_habit_value |
-----------------------------------------------------
| 1  | date1 | Good             | 4                 | 
| 2  | date2 | Bad              | 2                 |
| 3  | date3 | OK               | 3                 |
| 4  | date4 | Good             | 4                 |
| 5  | date5 | Great            | 5                 |
-----------------------------------------------------
habit_values

| habit_value | habit_text |
----------------------------
| 1           | Terrible   | 
| 2           | Bad        |
| 3           | OK         |
| 4           | Good       |
| 5           | Great      |
----------------------------

habit_log是我每天记录我做了什么的表,随着时间的推移,它会增加.habit_values是保存评价值和文本的表.daily_habit_value列是绑定到habit_value列的外键.

我想要一个列,要么在habit_values表中,要么在一个新的表中,显示每个habit_valuehabit_log表中出现的次数.然后,我将使用它来创建图表.每次向habit_log表添加新行时,该列都需要更新.

我try 了很多不同的计数、连接和外键的方法,但它们都是徒劳的.我看了这么多帖子,但似乎没有一个足够具体地满足我的要求,或者我只是不够了解,看不出它们之间的联系.看到解决方案,或者解决方案,真的会帮助我看到我错过了什么,并向我指出一些我需要深入学习的东西.

推荐答案

The SQL query you provided:

SELECT
  hv.habit_value,
  hv.habit_text,
  COUNT(hl.id) AS habit_count
FROM
  habit_values hv
LEFT JOIN
  habit_log hl ON hv.habit_value = hl.daily_habit_value
GROUP BY
  hv.habit_value,
  hv.habit_text;

该查询在Habit_Values和Habit_LOG表之间执行连接,以计算每个Habit_Value的出现次数.它使用左连接来确保Habit_Values表中的所有行都包含在结果中,并通过匹配Habit_log表中的Daily_Habit_Value来计算出现次数.结果包括每个Habit_Value、其对应的Habit_Text和Count as Habit_count列.

The trigger-based approach:

CREATE TRIGGER update_habit_count AFTER INSERT ON habit_log
FOR EACH ROW
BEGIN
    UPDATE habit_values
    SET count = count + 1
    WHERE habit_value = NEW.daily_habit_value;
END;

每当向Habit_LOG表中插入新行时,都会执行该触发器.触发器使用NEW关键字引用新插入的行.触发时,它会为Habit_Values表中与Daily_Habit_Value匹配的行将计数值递增1,从而更新计数值.

通过使用此触发器,每当向Habit_LOG表中添加新行时,计数值都会自动更新.

这两种方法都实现了更新Habit_Values表中的COUNT列的目标.使用SQL查询,您可以在需要时手动执行查询以获得最新结果.另一方面,基于触发器的方法通过在插入新行时自动更新计数值来确保计数值始终是最新的.

I thought it would be best to get the values with a SQL query and cache them.

Mysql相关问答推荐

返回50%的随机结果

错误:数据包顺序错误.GET:0预期:10 node JS MySQL

SQL MaxSum查询为列 Select 了不正确的值

约会时的意外行为

使用复合主键更新后的MySQL触发器失败

为什么MySQL派生条件下推优化不起作用

MySQL grant语句中的用户名区分大小写

在两个日期之间生成每个月的1行数据.

如何在 WampServer 上重新初始化 MySQL 以允许 lower_case_table_names = 2

当mysql中只有一个索引列时,为什么使用范围条件锁定读取会锁定每条记录?

关联同一个表中的两列

基于关系的每个实体有一个真值和多个假值

如何在每个国家/地区查询 GHTorrent(类 SQL 语言)的最常用语言

在 MySQL 中 Select COUNT of MAX

是否可以从 .SQL 文件中计算表中的行数?

MySQL:按字段排序,将空单元格放在末尾

Ubuntu 中的 MySQL JDBC jar 文件在哪里?

在 MySQL 中的子查询上使用 GROUP_CONCAT

电话号码和地址的mysql数据类型

mysql错误'TYPE = MyISAM'