你有semester
专栏,但学期每年都会重复。因此,如果您跟踪约翰的完整学术生涯,您将无法判断特定的第二学期属于哪一年。
其次,您的架构未标准化。应该有一张students
带有user_id
和的表user_name
。应该有一个courses
带有course_id
, course_name
,的表course_date
。并且应该有一个marks
带有mark_id
, course_id
, semester enum('1st','2nd') not null
, user_id
,的表mark
。该marks
表可能有一个由course_id
andsemester
和组成的唯一 id user_id
,这将防止学生每学期每门课程获得超过一个分数,并且从逻辑上讲,即使该课程,课程表每年都会获得每门课程的新记录与去年的课程相同。
鉴于上述情况,查询将类似于:
SELECT m1.user_id, m1.course_id,
CASE WHEN m1.mark > m2.mark THEN 'bad'
WHEN m1.mark < m2.mark THEN 'good'
ELSE 'same' END AS trend
FROM marks m1 JOIN marks m2
ON (m1.user_id = m2.user_id AND m1.course_id= m2.course_id)
WHERE m1.semester=1 AND m2.semester=2;
这将给出:
user_id, course_id, trend
1, 1, 'good'
1, 2, 'bad'
用英语代替 ids,
SELECT user_name, course_name,
CASE WHEN m1.mark > m2.mark THEN 'bad'
WHEN m1.mark < m2.mark THEN 'good'
ELSE 'same' END AS trend
FROM marks m1 JOIN marks m2
ON (m1.user_id = m2.user_id AND m1.course_id= m2.course_id)
JOIN users u ON (m1.user_id=u.user_id)
JOIN courses c ON (m1.course_id=c.course_id)
WHERE m1.semester=1 AND m2.semester=2;
这将给出:
user_id, course_id, trend
John, math, 'good'
John, english, 'bad'
您可以摆弄聚合函数并旋转输出。但由于您使用 PHP 进行输出,我可能会在那里进行支点。这使您可以处理任意数量的课程,而无需提前知道它们将是什么。