前言
又好久没有写博客了,为什么呢?因为最近没怎么写代码....说起来也惭愧。
今天在项目上遇到了个需求,是这样的:我们数据库中有一表检测记录表
,该表中存储的是所有居民每次的检测记录,说白点就是,张三在今天检测了两次心电,那么该表中就会有两条记录,如果李四在今天检测了4次,那么表中就存的是4次的记录。如下所示:
像这样的检测记录表有9个,现在我们要实现,查询每个表中所有居民的最后一次检测记录。
sql语句
需求:查询所有居民的最后一次检测记录,包括居民信息,那么我们可以做出如下分析:
- 检测记录表需要和居民表进行关联查询,因为我们需要拿到居民的信息,在检测记录表中只有居民的
id
- 在检测记录表中,需要按照居民分组查询,因为同一居民可能测多次,在表中存储的就是多次的记录。
- 需要按照检测时间降序排序检测记录表中的数据,因为我们需要知道最后一次的检测时间。
综上所述,我们就可以慢慢的整理出以下的sql
,如下所示:
SELECT
lm.name AS NAME,
T1.heartratenum AS heartratenum,
T1.ai_remark AS ai_remark,
T1.dr_remark AS dr_remark,
T1.create_time AS create_time,
T1.user_id AS user_id,
T1.member_id AS member_id,
T1.sys_org_code AS sys_org_code,
lm.birthday AS birthday,
lm.sex AS sex,
lm.phone AS phone,
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), lm.birthday)), '%Y')+0 AS age
FROM (SELECT A.*
FROM(SELECT A.*,
@row_number := IF(@member_id = A.member_id OR @member_id IS NULL,@row_number + 1,1) AS RN,
@member_id := A.member_id AS member_id1
FROM lt_ecg A,(SELECT @row_number := 0) B,(SELECT @member_id := NULL) C
ORDER BY A.member_id,A.measure_time DESC) A
WHERE A.RN = 1) T1
INNER JOIN lt_member lm
ON T1.member_id = lm.id
这样查出来如下所示: