3

我有一个mysql表tbl_exam

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

在此之后,我想将第一学期的成绩与第二学期的成绩进行比较。即数学在提高,英语在下降

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

你的桌子似乎有点不对劲,因为John有 2 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专栏,但学期每年都会重复。因此,如果您跟踪约翰的完整学术生涯,您将无法判断特定的第二学期属于哪一年。

其次,您的架构未标准化。应该有一张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 进行输出,我可能会在那里进行支点。这使您可以处理任意数量的课程,而无需提前知道它们将是什么。

于 2012-12-06T13:46:02.130 回答