mysql 如何创建一个列,该列的计数来自另一个值表?

qhhrdooz  于 2023-06-28  发布在  Mysql
关注(0)|答案(1)|浏览(101)

我刚开始学习MySQL和关系数据库。我决定尝试为自己构建一个非常简单的日常习惯跟踪数据库/应用程序,作为过程的一部分。我已经取得了进展,在不小的部分感谢所有伟大的信息在这里,但我还没有能够弄清楚这一点。这是我的两张table。

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表添加新行时,该列都需要更新。
我已经尝试了很多不同的计数、连接和外键的方法,但都是徒劳的。我看了这么多的帖子,但似乎没有一个是足够具体的我的要求,或者我只是不知道足够多的,看看他们是如何联系起来的。看到解决方案,或解决方案,真的会帮助我看到我错过了什么,并指出我需要做更深入的学习潜水的一些事情。

ecr0jaav

ecr0jaav1#

您提供的SQL查询:

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的出现次数。它使用LEFT JOIN来确保habit_values表中的所有行都包含在结果中,并通过匹配habit_log表中的daily_habit_value来计算出现次数。结果包括每个habit_value、其对应的habit_text和count as habit_count列。

基于触发器的方法:

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查询,您可以在需要时手动执行查询以获得最新结果。另一方面,基于触发器的方法通过在插入新行时自动更新计数值来确保计数值始终是最新的。

我认为最好使用SQL查询获取值并缓存它们。

相关问题