你有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_idandsemester和组成的唯一 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 进行输出,我可能会在那里进行支点。这使您可以处理任意数量的课程,而无需提前知道它们将是什么。