Mysql组/订购

时间:2013-04-13 08:56:27

标签: mysql grouping

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

用于出席,并为每个新活动添加评分新行。

我正在尝试从学生表中获取信息并列出出勤表中列出的总课程,从评分表中查找他们当前的成绩信息 并按grade_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

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

希望一切都有道理。

干杯。

2 个答案:

答案 0 :(得分:0)

  1. 由于您GROUP BY a.student_id,每位学生的展示次数不会超过一次。

  2. 由于您加入了记录,记录可能会消失。如果grades_list中没有学生,则无法加入,因此不会显示记录。您可能希望LEFT JOIN

答案 1 :(得分:0)

  

我正在尝试从学生表中获取信息并列出出勤表中的总课程,从评分表中查找他们当前的成绩信息,并按grade_list表中设置的顺序订购。

     

---如果每个人的成绩不止一个(最终会有)---

后者让我觉得你应该重新编写数据库。丢失grades表。我相信学生在任何时候都只能有一个年级,所以要把它作为学生的一个属性。现在你真正需要的是studentattendance之间的1:n关系。你按student.grade订购学生。 (参加某一活动的学生。)

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

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

我更喜欢“完整”的成绩历史方法,但是这会使订阅学生按照参加活动的等级变得更加复杂。

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

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每列: