Mysql 如何在SELECT语句中创建一个计算列,以确定某个成绩是否是奖励给该学生的最新成绩?

Mysql 如何在SELECT语句中创建一个计算列,以确定某个成绩是否是奖励给该学生的最新成绩?,mysql,Mysql,我在MySQL 5.6数据库中有这个表。它收集教师(usermodified)在学生尝试每个评估项目(itemid)时授予学生的分数(最终分数),评估项目可以是作业、测验、论坛讨论、课程总分数等。我只需要关于作业的信息,因此,我在source='mod/assign'上过滤该表,以获取如下数据: | id | itemid | source | userid | finalgrade | usermodified | feedback | tim

我在MySQL 5.6数据库中有这个表。它收集教师(usermodified)在学生尝试每个评估项目(itemid)时授予学生的分数(最终分数),评估项目可以是作业、测验、论坛讨论、课程总分数等。我只需要关于作业的信息,因此,我在source='mod/assign'上过滤该表,以获取如下数据:

| 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
at
id=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;