比较表中的mysql数据

时间:2012-12-06 12:55:09

标签: php mysql

我有一个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      |

我只是获取结果,但不知道如何解决。任何帮助将不胜感激

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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与John一样,只有ID会增加。

答案 2 :(得分:1)

您有semester列,但学期每年重复一次。因此,如果您正在追踪约翰完整的学术生涯,那么您将无法分辨特定的第二学期属于哪一年。

其次,您的架构未规范化。应该有一个表students user_iduser_name。应该有courses表格course_idcourse_namecourse_date。应该有marksmark_idcourse_idsemester enum('1st','2nd') not nulluser_idmarkmarks表格可以包含由course_idsemester以及user_id组成的唯一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输出,我可能会在那里做转移。这使您可以处理任意数量的课程,而无需提前知道它们将会是什么。