我有这两个表:
学生:
| name | email | |---------------------|-------------------------| | Arturo Vidal | arturo.vidal@usm.cl | | Bastian Quezada | bastian@usm.cl | | Javier Jeria | javier@usm.cl | | Sebastian Pi帽era | sebastian@presidente.cl | | Sebastian Gallardo | sebastian@usm.cl |
班级:
| classId | email | signUpDate | |---------|-------------------------|-------------| | 1 | sebastian@usm.cl | 2018-01-01 | | 1 | javier@usm.cl | 2019-10-01 | | 1 | bastian@usm.cl | 2018-07-01 | | 2 | sebastian@usm.cl | 2018-05-04 | | 2 | bastian@usm.cl | 2018-01-01 | | 3 | bastian@usm.cl | 2018-12-05 | | 3 | sebastian@usm.cl | 2018-02-01 | | 4 | arturo.vidal@usm.cl | 2018-03-01 | | 5 | sebastian@presidente.cl | 2018-03-01 |
我想给这个名字显示最后一个注册每个classId的学生的名字。这意味着,我应该为classId 1获得一个名称,为classId 2获得一个名称,以此类推。首先获取邮件(之后才知道学生的名字)的解决方案是:
select classId, email, max(signUpDate) from Class group by classId
它会打印最大日期,这是可以的,但同时也会为每个日期打印错误的邮件:
| ClassId | email | max(signUpDate) | |---------|-------------------------|-----------------| | 1 | sebastian@usm.cl | 2019-10-01 | | 2 | sebastian@usm.cl | 2018-05-04 | | 3 | bastian@usm.cl | 2018-12-05 | | 4 | arturo.vidal@usm.cl | 2018-03-01 | | 5 | sebastian@presidente.cl | 2018-03-01 |
这是完全错误的()。因此,当我尝试加入用于获取名称的值时,会得到不正确的值。
换句话说,我不明白为什么行混合在一起。是否有任何解决方案可以为每个ClassId的max(signUpDate)获取正确的电子邮件?
谢谢你的时间
我创建了测试数据小提琴,并进行了简单易懂的查询以获取所需的数据,即:
SELECT DISTINCT classId, std.name, Class.email, signUpDate FROM CLASS INNER JOIN Student std ON std.email = Class.email WHERE signUpDate IN (SELECT max(signUpDate) FROM CLASS GROUP BY classId)
SQL小提琴在这里