如何根据特定id_pasien查询对应最新created_at的id_start_odon?
解决查询特定患者最新记录的id_start_odon问题
我来帮你排查下问题,顺便给出几个靠谱的解决方案~
首先看你写的SQL,这里有两个明显的错误:
- 子查询里的
s2*是语法错误,正确的写法要么是s2.*要么指定具体字段,但这里其实不需要选字段,只需要聚合值; - 子查询里直接把
MAX(s2.created_at)放在WHERE条件里是不对的——聚合函数不能直接用在WHERE子句中,而且你的子查询逻辑绕了弯路,其实只需要拿到该患者的最大created_at值就行。
接下来给你几种可行的正确写法:
方案一:先获取最大创建时间再匹配
这是最直观的写法,先通过子查询拿到指定id_pasien对应的最大created_at,再在外层查询中匹配这个时间和患者ID:
public function get_latest($id_pasien){ $query = "SELECT s1.id_start_odon FROM start_odon s1 WHERE s1.id_pasien = $id_pasien AND s1.created_at = (SELECT MAX(s2.created_at) FROM start_odon s2 WHERE s2.id_pasien = $id_pasien)"; $res = $this->db->query($query); // 根据你的框架返回结果,比如CodeIgniter中取单行的id_start_odon return $res->row()->id_start_odon; }
⚠️ 注意:如果created_at是精确到时分秒的时间戳,这个方法完全没问题;但如果同一天有多个同患者的记录,会返回所有当天的id_start_odon。要是你只需要绝对最新的那一条(哪怕同一秒有多条),可以看下面的方案二。
方案二:排序后取第一条
通过ORDER BY按created_at降序排序,再用LIMIT 1只取第一条记录。这样即使同一时间有多个记录,也能拿到最新的那条(通常数据库会默认按主键降序排序,也就是最新插入的那条):
public function get_latest($id_pasien){ $query = "SELECT id_start_odon FROM start_odon WHERE id_pasien = $id_pasien ORDER BY created_at DESC, id_start_odon DESC LIMIT 1"; $res = $this->db->query($query); return $res->row()->id_start_odon; }
这个写法更简洁,而且如果给id_pasien和created_at建了联合索引,查询性能会非常好。
重要提醒:避免SQL注入
你直接把$id_pasien拼进SQL语句里是有SQL注入风险的!如果用的是CodeIgniter框架,强烈建议用参数绑定来规避这个问题,写法如下:
public function get_latest($id_pasien){ $query = "SELECT id_start_odon FROM start_odon WHERE id_pasien = ? ORDER BY created_at DESC, id_start_odon DESC LIMIT 1"; $res = $this->db->query($query, [$id_pasien]); return $res->row()->id_start_odon; }
框架会自动帮你处理参数转义,安全性拉满~
内容的提问来源于stack exchange,提问作者Nadia
相关产品推荐
相关产品推荐

