我有一个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 |
我只是获取结果,但不知道如何解决。任何帮助将不胜感激
答案 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_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
组成的唯一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输出,我可能会在那里做转移。这使您可以处理任意数量的课程,而无需提前知道它们将会是什么。