2014-11-06 43 views
0

在SQL假设我们有一个名为 '课程' 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查询的正确的方法,以及这将是巨大的。谢谢

回答

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; 
+0

如果我要摆脱总学分字段,是否可以查询学生(从学生中选择*)并将总学分总和加入到结尾? – 2014-11-06 20:44:53

+0

select * from( select s.s_id,s.name,sum(c.credits)from course c,students s,courses_taken ct where ct.c_id = courses.c_id和ct.s_id = s.s_id GROUP BY s。 s_id) 其中s_id = 0;这会工作吗? – 2014-11-06 20:58:53

+0

我的答案中的查询将会列出所有学生姓名及其学分总数。你可以在where子句中添加AND s_id = 0,不需要子查询。 – andy 2014-11-06 21:03:24

2

没有什么“内置”到MySQL,可以让你直接做到这一点。每次更新courses_takencourses表时,您都必须编写一些代码来更新total_credits

有处理这虽然

  1. 把代码写在你的应用程序,以保持total_credits列几个选项。

  2. 写上使用coursescourses_taken表上的触发器来保持total_credits列了最新的插入行时/更新/删除数据库的代码。

  3. 摆脱total_credits列,并在需要查询时只计算它(请参阅@ andy的回答)。

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

你挑将取决于应用程序的要求您在使用这个数据库。

+0

选项3实际上似乎最符合逻辑的,但我的客户想要的总学分在数据库 – 2014-11-06 20:41:00

+0

@Cody表示 - 我会同意。也许你可以使用查询创建一个视图。那么技术上就是“在数据库中”:)我讨厌它,当客户指定实现细节而不真正理解技术时.. – 2014-11-06 20:45:00

+0

我想即将实施一个'黑客',阅读@andy发表的评论,感谢您的帮助。非常感谢 – 2014-11-06 20:46:42

相关问题