子查询-分组查询最新一条记录

表结构

image.png

image.png

说明:user表存储学生基本信息,plan表存储学生计划信息,其中一个学生可以存储多个计划,plan表中optime字段表示学生操作时间

需求

根据某一实验室id查询属于该实验室的所有学生的最新一条计划

分析

本次查询可以分解为3个子查询

  • 根据实验室id查询所有属于该实验室的学生列表
  • 根据学生id查询属于该学生的所有计划列表
  • 筛选出每个学生所有计划列表中的最新一条

sql语句

SELECT
    *
FROM
    (
        SELECT DISTINCT
            pms_plan.id AS plan_id,
            pms_plan.title,
            pms_plan.status1,
            pms_plan.status2,
            pms_plan.`status`,
            pms_plan.created,
            pms_plan.expired,
            pms_plan.optime,
            pms_user_stu.id AS stu_id,
            pms_user_stu.nickname,
            pms_user_stu.created AS enroll_date
        FROM
            pms_user_stu
        LEFT JOIN pms_plan ON pms_user_stu.id = pms_plan.stu_id
        WHERE
            pms_user_stu.exp_id = 63
        ORDER BY
            pms_plan.optime DESC
    ) as m
GROUP BY
    m.stu_id

本次查询使用了内联子查询,子查询内部使用关联查询出所有学生的所有计划列表(可以单独运行观察),将子查询的结果(表)作为新的数据源,此时该数据源相当于一个新表,使用GROUP BY语句进行分组取每个分组第一条记录,每个分组使用ORDER BY ...DESC语句进行降序排列,便实现了联合两表查询不同分组最新的一条记录。

结果

image.png

你可能感兴趣的:(子查询-分组查询最新一条记录)