MySQL从多个表和最近的记录中选择

时间:2018-04-09 18:14:54

标签: mysql select join greatest-n-per-group

我遇到了选择查询的问题,并且无法弄清楚如何解决问题。我有两张桌子:

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行(因为有五个分数)。我想要的是查询返回三行(每个学生一个)和他们的最新得分值(如果他们没有得分,则为NULL):

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

我很难确定如何拉动所有学生,无论他们是否有分数,如果他们有分数,如何只提取最新分数。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是问题的变体,这在Stack Overflow上很常见。

我会通过几个连接来做到这一点:

$("#newsTitle").keypress(function() {
if($(this).val().length == 20) {
    document.getElementById('newsTitle').style.borderColor = "red";
   }
});

如果c2.STU_ID为null,则表示LEFT JOIN没有匹配c1中的行具有更大日期(或者是平局时更大的SRE_ID)的行。这意味着c1中的行必须是最新的,因为没有其他更新的行。

P.S。:请学习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; 语法,并避免使用"逗号样式"连接。 JOIN自1992年以来一直是标准。

P.P.S。:我删除了多余的" TABLE _"来自表名的前缀。您不需要使用表名来提醒自己它是一张桌子! : - )

答案 1 :(得分:0)

您可以使用相关子查询:

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