mysql从多个表和最新记录中选择

vuv7lop3  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(388)

我在select查询中遇到问题,无法确定如何修复。我有两张table:

TABLE_students

|--------|------------|--------|
| STU_ID |   EMAIL    |  NAME  |
|--------|------------|--------|
|   1    | a@e.com    | Bob    |
|   2    | b@e.com    | Joe    |
|   3    | c@e.com    | Tim    |
--------------------------------

TABLE_scores

|--------|------------|-------------|--------|
| SRE_ID |   STU_ID   |  DATE       |  SCORE |
|--------|------------|-------------|--------|
|  91    | 2          | 2018-04-03  |  78    |
|  92    | 2          | 2018-04-06  |  89    |
|  93    | 3          | 2018-04-03  |  67    |
|  94    | 3          | 2018-04-06  |  72    |
|  95    | 3          | 2018-04-07  |  81    |
----------------------------------------------

我试图从两个表中选择数据,但有一些要求。我需要选择学生,即使他们在分数表中没有分数。我也只想要最新的分数记录。
下面的查询只返回那些有分数的学生,它还重复返回总共5行(因为有5个分数)。我希望查询返回三行(每个学生一行)及其最新分数值(如果没有分数,则返回null):

SELECT students.NAME, scores.SCORE FROM TABLE_students as students, TABLE_scores AS scores WHERE students.STU_ID = scores.STU_ID;

我很难弄清楚如何拉所有的学生,不管他们是否有一个分数,以及如何拉只有最新的分数,如果他们有一个。
谢谢您!

ejk8hzay

ejk8hzay1#

这是组最大n个问题的一个变体,这在堆栈溢出中很常见。
我会通过几个连接来实现这一点:

SELECT s.NAME, c1.DATE, c1.SCORE
FROM students AS s
LEFT JOIN scores AS c1 ON c1.STU_ID = s.STU_ID
LEFT JOIN scores AS c2 ON c2.STU_ID = s.STU_ID 
  AND (c2.DATE > c1.DATE OR c2.DATE = c1.DATE AND c2.SRE_ID > c1.SRE_ID)
WHERE c2.STU_ID IS NULL;

如果c2.stu\u id为空,则表示左连接匹配的行中没有比c1中的行具有更大日期的行(或者在并列的情况下具有更大sre\u id)。这意味着c1中的行必须是最近的,因为没有其他行是最近的。
p、 学生:请学习英语 JOIN 语法,并避免“逗号式”联接。 JOIN 自1992年以来一直是标准的。
p、 注意:我从你的表名中去掉了多余的“table\”前缀。您不需要使用表名来提醒自己它是一个表!:-)

e5nqia27

e5nqia272#

可以使用相关子查询:

SELECT *, 
 (SELECT score FROM TABLE_scores sc 
  WHERE sc.stu_id = s.stu_id ORDER BY DATE DESC LIMIT 1) AS score
FROM TABLE_students s

相关问题