假设我们有一个名为' courses',' student,' courses_taken'
的表课程
c_id key int
name text
credits int
学生
s_id key int
name text
total_credits int
courses_taken
id key int
s_id foreign int
c_id foreign int
我想使total_credits字段基本上等于
select sum(c.credits) from courses c, students s, courses_taken ct where ct.c_id = courses.c_id and ct.s_id = s.s_id;
并且我假设这不是正确的方法,因为我之前从未使用过多表查询,如果有人可以帮我处理那个sql查询,那就太好了。感谢
答案 0 :(得分:2)
没有什么"内置"到MySQL,你可以直接这样做。每次更新total_credits
或courses_taken
表时,您都必须编写一些代码来更新courses
。
虽然
有几种处理方法在您的应用程序中编写代码以维护total_credits
列。
使用courses
和courses_taken
表上的触发器在数据库中编写代码,以便在插入/更新/删除行时使total_credits
列保持最新
删除total_credits
列,并在需要时通过查询进行计算(请参阅@ andy的答案)。
编写一份定期计算total_credits
的批处理作业,并接受它不会始终100%正确的事实。
您选择的内容取决于您使用此数据库的应用程序的要求。
答案 1 :(得分:1)
您的查询几乎正确但缺少GROUP BY
子句,该子句告诉服务器实际汇总哪些行。目前,您正在创建一个临时表,其中每行包含有关单个课程的信息,并由课程学分和学生姓名丰富。选择sum()
将只汇总所有课程和所有学生的所有学分。
因此,您需要按课程或学生分组,以分别获得课程或学生的积分总和。学生的结果将是:
select s.name, sum(c.credits) as total_credits from courses c, students s, courses_taken ct where ct.c_id = courses.c_id and ct.s_id = s.s_id GROUP BY s.s_id;