コラムはありsemester
ますが、学期は毎年繰り返されます。したがって、ジョンの完全な学歴を追跡している場合、特定の第 2 学期がどの学年に属していたかを知ることはできません。
次に、スキーマが正規化されていません。と を含む 1 つのテーブルstudents
が必要です。、、のテーブルがあるはずです。そして、、、、、のテーブルがあるはずです。テーブルは、 とで構成される一意の ID を持つことができます。これにより、学生がコースごとに学期ごとに複数のマークを持つことを防ぎ、論理的には、そのコースが提供されている場合でも、毎年コース テーブルが提供される各コースの新しいレコードを取得することを意味します。昨年度のコースと同じです。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
semester
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'
ID を英語に置き換えるには、
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 で出力しているので、おそらくそこでピボットを行います。これにより、事前に何になるかを知らなくても、任意の数のコースを処理できます。