0

我有一个表,其中第一列指的是用户名,其他列指的是学生所做的每个科目以及每个科目的技能水平。这些科目属于数学,艺术等几个主要科目流。

我将数据标准化为下表。

主题_流

id Main_Stream Subject
1 Math pure-maths

2 Math applied-maths

3 Art Dancing

4 Art Music

学生表

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

我可以使用类似的查询来获取任何给定学生的科目及其技能水平。

除此之外,当我选择任何科目或科目集合时,我需要选择学生。并按降序打印他们的姓名、科目、技能水平。

在这里,任何学生也可以在不同的课程中学习不同的科目。

但是我不能轻易地从我现有的表中得到这个结果。如何正确执行此操作?我需要改进数据库架构吗?

4

2 回答 2

1

首先,我想对您的表结构提出两个小改进,以更好地规范数据。你的桌子Student_table组织得更好

  1. 代替name你从你的学生表中引用 user_id (这意味着学生的名字只出现在你的学生表中 - 记住,名字可以改变,pe结婚)和
  2. 而不是subject您引用主题的 id 的名称 - 因此主题的名称仅存在于您的表中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

基于此,您应该能够获得您描述的每个查询。有关细节,请更新您的问题并添加一些示例,您想要的结果如何,然后我会研究它并给您一些示例。

于 2013-06-23T17:48:40.107 回答
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子句一开始是最容易理解的。

按流选择(在本例中为数学)。. .

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
于 2013-06-23T19:34:46.677 回答