我有一张表,其中第一列引用用户名,其他列引用学生所做的每个科目以及每个科目的技能水平。这些科目属于数学,艺术等几个主要科目。
我将数据规范化为以下表格。
Subject_Stream
id Main_Stream Subject
1 Math pure-maths
2 Math applied-maths
3 Art Dancing
4 Art Music
Student_table
id name subject skill_level
1 xxx Music 5
2 xxx Pur-math 4
3 xxx Applied-math 1
4 yyy Music 3
select subjects, skill_level where usename="xxx" order by Desc
我可以使用类似的查询来获得任何特定学生的科目及其技能水平。
除此之外,我需要在选择任何科目或科目集合时选择学生。并按降序打印他们的姓名,科目,技能水平。
这里任何一个学生也可以在不同的流程中做不同的科目。
但是我不能轻易从现有表中获得此结果。怎么做到这一点? 我是否需要改进数据库架构?
答案 0 :(得分:1)
首先,我想建议对表结构进行两项小改进,以便更好地规范化数据。如果
,您的表格Student_table
将会更好地组织
name
你引用了studends-table中的user_id(这意味着学生的名字只出现在你的studends-table中 - 记住,名字可以改变,例如婚姻)和subject
的名称 - 因此主题的名称仅出现在您的表Subject_Stream
中。 您的表格Student_table
将如下所示:
id user_id subject_id skill_level
--------------------------------
1 1 4 5
2 1 1 4
3 1 2 1
4 2 4 3
基于此,您应该能够获得您描述的每个查询。有关具体信息,请更新您的问题,并添加一些示例,了解您希望的结果如何,然后我会调查并给您举几个例子。
答案 1 :(得分:1)
除此之外,我需要在选择任何科目时选择学生 或收集的主题。并打印他们的名字,科目, 技能水平按降序排列。
对于单个科目。 。
select name, subject, skill_level
from Student_table
where subject = 'your subject name'
order by skill_level desc, name asc
适用于多个科目。 。
select name, subject, skill_level
from Student_table
where subject = 'some subject name'
or subject = 'some other subject name'
order by skill_level desc, name asc
还有其他方法来表达这种查询,但我认为最初最容易理解的是多个OR子句。
按流选择(在本例中为Math)。 。
select Student_table.name
, Student_table.subject
, Student_table.skill_level
, subject_stream.main_stream
from Student_table
inner join subject_stream
on subject_stream.subject = student_table.subject
where subject_stream.main_stream = 'Math'
order by Student_table.skill_level desc, name asc