0

我的武术俱乐部有一个学生管理系统,不同类型的信息存储在不同的数据库表中,

出勤率和评分会为每个新事件添加一个新行。

我正在尝试从学生表中获取信息,并从出勤表中列出参加的总课程,从评分表中找到他们当前的成绩信息,并按照 Grades_list 表中设置的顺序对其进行排序。

所以我有这个:

SELECT * , COUNT( date ) AS `count` 
  FROM attendance a
    JOIN students s ON a.student_id = s.student_id
    JOIN gradings g ON g.student_id = s.student_id
    JOIN grades_list gl ON gl.grade = g.grade
      WHERE s.class <>'Little Monsters'
        AND date
        BETWEEN'2013-01-01'
        AND now() 
          GROUP BY a.student_id
          ORDER BY gl.ID

这目前做了正确的事情,但它没有显示所有结果,如果每个人的等级有多个条目(最终会有),它会显示一个结果但不是最新的。我目前在评分表中有两个人,每个人有两个条目,其中一个人根本没有显示,另一个人显示他们最旧的记录,应该显示最新的记录。

希望一切都说得通。

干杯。

4

2 回答 2

0
  1. 既然你GROUP BY a.student_id,每个学生将不会超过一次。

  2. 记录可能会因为您的加入而消失。如果学生不在grades_list,则没有可加入的内容,因此不会显示记录。你可能想要LEFT JOIN

于 2013-04-13T09:01:13.043 回答
0

我正在尝试从学生表中获取信息,并从出勤表中列出参加的总课程,从评分表中找到他们当前的成绩信息,并按照 Grades_list 表中设置的顺序进行排序。

–––如果每个人的等级有多个条目(最终会有)–––</p>

后者让我认为您可能应该重新设计数据库。丢grades表。我相信学生在任何给定时间只能获得一个成绩,因此将其作为学生的属性。student现在您真正需要的是和之间的 1:n 关系attendance。你按 . 对学生进行排序student.grade。(参加某个活动的学生。)

如果要记录学生成绩的历史记录,可以grade_when_attended在表中添加一列attendance。或者制作一个专用grade_history表:

  • student_id, PK, FK 到student_id
  • grade, PK, FK 到grade_list
  • date_when_earned,date
  • ...(?)

我更喜欢“完整的”年级历史方法,但这会使按参加活动的年级排序学生有点复杂。

可能的查询,简化(如果可行的话,让我们考虑按等级排序等):

SELECT s.* , GROUP_CONCAT(a.column1), GROUP_CONCAT(a.column1)
  FROM students s
  LEFT JOIN attendance a ON a.student_id = s.student_id
  WHERE s.class <>'Little Monsters'
    AND date
    BETWEEN'2013-01-01'
    AND now() 
      GROUP BY s.student_id

上面的查询仅显示当前成绩,因此如果在指定时间段内获得新成绩,事情可能会变得一团糟。(快速而肮脏的解决方案是将grade_when_attended列添加到attendance表格中,以便您获得当前成绩和时间段内每次出勤的每个成绩。)

请记住,您需要GROUP_CONCAT分别对每一列:

于 2013-04-13T10:12:04.023 回答