我的武术俱乐部有学生管理系统, 不同类型的信息存储在不同的数据库表中,
用于出席,并为每个新活动添加评分新行。
我正在尝试从学生表中获取信息并列出出勤表中列出的总课程,从评分表中查找他们当前的成绩信息 并按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
这目前做的是正确的,但它没有显示所有结果,如果每个人等级(最终会有)有多个条目,它会显示一个结果,但不会显示最新结果。我目前在评分表中有两个人,每个人有两个条目,其中一个人没有显示,另一个人显示他们应该显示的最新记录。
希望一切都有道理。
干杯。
答案 0 :(得分:0)
由于您GROUP BY a.student_id
,每位学生的展示次数不会超过一次。
由于您加入了记录,记录可能会消失。如果grades_list
中没有学生,则无法加入,因此不会显示记录。您可能希望LEFT JOIN
。
答案 1 :(得分:0)
我正在尝试从学生表中获取信息并列出出勤表中的总课程,从评分表中查找他们当前的成绩信息,并按grade_list表中设置的顺序订购。
---如果每个人的成绩不止一个(最终会有)---
后者让我觉得你应该重新编写数据库。丢失grades
表。我相信学生在任何时候都只能有一个年级,所以要把它作为学生的一个属性。现在你真正需要的是student
和attendance
之间的1:n关系。你按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
每列: