如何相对于另一个表创建单元格值?

时间:2014-11-06 20:21:20

标签: mysql

SQL中的

假设我们有一个名为' 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查询,那就太好了。感谢

2 个答案:

答案 0 :(得分:2)

没有什么"内置"到MySQL,你可以直接这样做。每次更新total_creditscourses_taken表时,您都必须编写一些代码来更新courses

虽然

有几种处理方法
  1. 在您的应用程序中编写代码以维护total_credits列。

  2. 使用coursescourses_taken表上的触发器在数据库中编写代码,以便在插入/更新/删除行时使total_credits列保持最新

  3. 删除total_credits列,并在需要时通过查询进行计算(请参阅@ andy的答案)。

  4. 编写一份定期计算total_credits的批处理作业,并接受它不会始终100%正确的事实。

  5. 您选择的内容取决于您使用此数据库的应用程序的要求。

答案 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;