代码之家  ›  专栏  ›  技术社区  ›  Dawn Deschain

在MySQL中,如何在Table1中设置一个新列,从Table2中提取特定列的COUNT()?

  •  1
  • Dawn Deschain  · 技术社区  · 1 年前

    我想把下面查询返回的数据放入表中的一个新列中 courses 调用 total_current_enrollments 。新列应根据表中的course_id自动生成不同student_id的COUNT() current_enrollments

    SELECT course_id, COUNT(student_id) 
    FROM current_enrollments
    GROUP BY course_id;
    
    • TABLE: courses
        • COLUMNS:
            o id INT AI PK
            o title VARCHAR(100) NN
            o number_of_credits INT
            o course_code VARCHAR(10)
            o lecturer_id INT
        
    • TABLE: current_enrollments
        • COLUMNS:
            o Id INT AI PK
            o course_id INT NN
            o lecturer_id INT
            o student_id INT
    

    我应该如何建立我的新专栏来实现这一点?

    也许一个默认的/表达式就可以了。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Bill Karwin    1 年前

    没有办法使用 DEFAULT 或生成的列来执行此操作。这些功能无法查询其他表。

    提到 https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html :

    。。。

    • 不允许使用子查询、参数、变量、存储函数和可加载函数。

    。。。

    提到 https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html :

    。。。

    • 不允许使用子查询。

    • 生成的列定义可以引用其他生成的列,但只能引用表定义中较早出现的列。生成的列定义可以引用表中的任何基列(非生成的),无论其定义发生在更早或更晚。

    。。。

    您有三种选择:

    选项1:在 current_enrollments 桌子当一行 当前注册(_E) 插入,则INSERT触发器将相应课程的计数列递增。当一行被删除时,DELETE触发器会递减相应课程的计数列。当一行更新时,检查课程是否已更改,如果已更改,则递减旧课程并递增新课程。

    理论上,这应该保持课程注册数的同步,但在实践中往往会不同步。这很神秘,但它确实发生了。

    选项2:定义一个查询 courses 表,联接到 当前注册(_E) 表,并使用 COUNT(*) 来计算报名人数。这肯定会更准确,但可能会拖累性能。

    选项3:通过应用程序逻辑保持计数的更新。根据我的经验,最好的方法是通过每N分钟运行一次类似于视图中的查询来重新计算计数,并更新 课程 桌子这意味着在注册和更新 课程 桌子但是,如果报名人数很少,那么99%以上的时间统计都是准确的。