【问题标题】:MySQL Select from Multiple Tables and most recent recordMySQL 从多个表和最近的记录中选择
【发布时间】:2018-04-09 18:14:53
【问题描述】:

我在选择查询时遇到问题,不知道如何解决。我有两张桌子:

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;

我很难弄清楚如何提取所有学生,无论他们是否有分数,以及如何仅提取最新的分数(如果有的话)。

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    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_ID 为 null,则表示 LEFT JOIN 不匹配日期大于 c1 中的行的行(或大于 SRE_ID 的行)。这意味着 c1 中的行必须是最近的,因为没有其他行是最近的。

    P.S.:请学习JOIN 语法,避免“逗号式”连接。 JOIN 自 1992 年以来一直是标准配置。

    P.P.S.:我从您的表名中删除了多余的“TABLE_”前缀。您无需使用表名来提醒自己这是一张表! :-)

    【讨论】:

      【解决方案2】:

      您可以使用相关子查询:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多