3

私はmysqlテーブルを持っていますtbl_exam

user_ID | User_name | semester | math | english |
1       | John      | 1st      | 67   |  73     |
1       | John      | 2nd      | 82   |  59     |

この後、1学期のマークと2学期のマークを比較したいと思います。つまり、数学は向上し、英語は低下しています。

user_ID | User_name | math  | english  |
1       | John      | good  | bad      |

結果を取得するだけですが、解決方法がわかりません。助けていただければ幸いです。

4

3 に答える 3

2

これを試して:

SELECT A.user_id, A.user_name, IF((B.math - A.math) > 0, 'good', 'bad') math, 
         IF((B.english - A.english) > 0, 'good', 'bad') english
FROM (SELECT user_id, user_name, math, english 
FROM tbl_exam WHERE semester = '1st') AS A 
INNER JOIN 
(SELECT user_id, user_name, math, english 
FROM tbl_exam WHERE semester = '2nd') AS B ON A.user_id = B.user_id 
于 2012-12-06T13:05:05.460 に答える
2

John2 があるため、テーブルは少し間違っているようuser_IDです。それはそのようであるべきです

  ID |user_ID | User_name | semester | math | english |
   1 |1       | John      | 1st      | 67   |  73     |
   2 |1       | John      | 2nd      | 82   |  59     |

user_IDジョンと同じように、IDインクリメントされるだけです。

于 2012-12-06T13:10:53.147 に答える
1

コラムはありsemesterますが、学期は毎年繰り返されます。したがって、ジョンの完全な学歴を追跡している場合、特定の第 2 学期がどの学年に属していたかを知ることはできません。

次に、スキーマが正規化されていません。と を含む 1 つのテーブルstudentsが必要です。、、のテーブルがあるはずです。そして、、、、、のテーブルがあるはずです。テーブルは、 とで構成される一意の ID を持つことができます。これにより、学生がコースごとに学期ごとに複数のマークを持つことを防ぎ、論理的には、そのコースが提供されている場合でも、毎年コース テーブルが提供される各コースの新しいレコードを取得することを意味します。昨年度のコースと同じです。user_iduser_namecoursescourse_idcourse_namecourse_datemarksmark_idcourse_idsemester enum('1st','2nd') not nulluser_idmarkmarkscourse_idsemesteruser_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 で出力しているので、おそらくそこでピボットを行います。これにより、事前に何になるかを知らなくても、任意の数のコースを処理できます。

于 2012-12-06T13:46:02.130 に答える