Mysql 如何在SELECT语句中创建一个计算列,以确定某个成绩是否是奖励给该学生的最新成绩?
我在MySQL 5.6数据库中有这个表。它收集教师(usermodified)在学生尝试每个评估项目(itemid)时授予学生的分数(最终分数),评估项目可以是作业、测验、论坛讨论、课程总分数等。我只需要关于作业的信息,因此,我在source='mod/assign'上过滤该表,以获取如下数据:Mysql 如何在SELECT语句中创建一个计算列,以确定某个成绩是否是奖励给该学生的最新成绩?,mysql,Mysql,我在MySQL 5.6数据库中有这个表。它收集教师(usermodified)在学生尝试每个评估项目(itemid)时授予学生的分数(最终分数),评估项目可以是作业、测验、论坛讨论、课程总分数等。我只需要关于作业的信息,因此,我在source='mod/assign'上过滤该表,以获取如下数据: | id | itemid | source | userid | finalgrade | usermodified | feedback | tim
| id | itemid | source | userid | finalgrade | usermodified | feedback | timemodified | is latest? |
|:--:|:------:|------------|:------:|:----------:|:------------:|:-----------------------------:|:------------:|------------|
| 1 | 4 | mod/assign | 3 | | 3 | | 1596173158 | No |
| 15 | 4 | mod/assign | 3 | | 3 | | 1596173203 | No |
| 16 | 4 | mod/assign | 3 | 2.00000 | 2 | <p>Needs more dragons<br></p> | 1596173324 | No |
| 18 | 4 | mod/assign | 3 | 2.00000 | 3 | <p>Too many dragons<br></p> | 1596173326 | No |
| 19 | 4 | mod/assign | 3 | 2.00000 | 3 | <p>Needs more dragons<br></p> | 1596173339 | No |
| 20 | 4 | mod/assign | 3 | 2.00000 | 3 | <p>4347jgfvgc<br></p> | 1596173343 | No |
| 21 | 4 | mod/assign | 3 | 2.00000 | 3 | <p>Apples and Carrots<br></p> | 1596173350 | No |
| 22 | 4 | mod/assign | 3 | 3.00000 | 2 | <p>khjgc<br></p> | 1596173371 | Yes |
| 24 | 4 | mod/assign | 4 | | 4 | | 1598234190 | No |
| 38 | 4 | mod/assign | 4 | | 4 | | 1598234202 | No |
| 39 | 4 | mod/assign | 4 | 2.00000 | 2 | | 1598234334 | No |
| 41 | 4 | mod/assign | 4 | 2.00000 | 4 | | 1598234335 | No |
| 42 | 4 | mod/assign | 4 | 2.00000 | 4 | | 1598234341 | No |
| 43 | 4 | mod/assign | 4 | 2.00000 | 4 | | 1598234356 | No |
| 44 | 4 | mod/assign | 4 | 2.00000 | 4 | | 1598234361 | Yes |
选择t1*
来自MyTableT1
其中t1.source='mod/assign'
我在谷歌和StackOverflow上搜索过类似的情况,但结果都是空的。有人将此问题标记为的关联,但我看不到一种方法来修改该问题的答案以适应我的情况
我感谢你的帮助 如果您使用的是MySQL 8+,则可以在此处使用
行数
:
SELECT *,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY userid ORDER BY timemodified DESC) = 1
THEN 'Yes' ELSE 'No' END AS IsLatest
FROM yourTable
ORDER BY
timemodified;
对于MySQL的早期版本,我们可以加入一个子查询,该子查询为每个用户查找最新的修改时间:
SELECT t1.*,
CASE WHEN t1.timemodified = t2.maxtimemodified
THEN 'Yes' ELSE 'No' END AS IsLatest
FROM yourTable t1
LEFT JOIN
(
SELECT userid, MAX(timemodified) AS maxtimemodified
FROM yourTable
GROUP BY userid
) t2
ON t1.userid = t2.userid
ORDER BY
t1.timemodified;
谢谢你的回复!我正在使用MySQL 5.6。我对我的表运行了您的查询,但没有得到所需的结果。我意识到我无意中遗漏了一些可能会揭示原因的信息:表格中有许多其他信息来源,而不是学生提交的作业,例如论坛成绩和课程总体成绩,因此我过滤表格,使其仅显示作业提交。那会把这个扔掉吗?我已经编辑了测试数据,以便更准确地显示内容。如果我的原始帖子有误导性,我道歉,我仍然不擅长数据库查询!此外,由于您的查询使用的是
timemodified
,是否使用该列来确定学生提交的作业的最新尝试?是否可以改用id
timemodified
如果老师返回并编辑上一次尝试的成绩,则可能会发生变化,我认为您的查询会错误地显示为最近一次尝试。实际上,我已经根据您显示的数据进行了回答。如果我的两个查询都不适用于您,请添加查询将失败的示例数据。我深表歉意!我已经用查询失败的数据编辑了示例数据。是输出的屏幕截图。唯一不正确的记录是IsLatest
atid=22
:它应该=Yes
。
SELECT t1.*,
CASE WHEN t1.timemodified = t2.maxtimemodified
THEN 'Yes' ELSE 'No' END AS IsLatest
FROM yourTable t1
LEFT JOIN
(
SELECT userid, MAX(timemodified) AS maxtimemodified
FROM yourTable
GROUP BY userid
) t2
ON t1.userid = t2.userid
ORDER BY
t1.timemodified;