最近写了条SQL,没注意踩坑了,丢脸了……
SQL要求: 分组后查询组内最新的一条记录,公司用的是MySQL,Oracle我就先不说了。不多说了,直接上SQL,这里附上一个在线格式化SQL的地址,比Navicat里面的美化SQL要好些,语句紧凑些
点我 => * 在线代码格式化 * <= 点我
SELECT t.holder_entity_id, t.tenant_id, MAX(t.maintain_time) AS maintain_time, t.maintain_user_id
, t.maintain_content, t.valid_flag, t.update_time
FROM t_tool_holder_maintain t
GROUP BY t.holder_entity_id
结果如下:
查了表的数据发现时间对不上。
我只看了时间以为是最新的记录,后来发现只有时间是最新的,那条记录不是,坑了坑了
那就是我SQL出问题了,修改成子查询语句如下:
SELECT *
FROM (
SELECT t.holder_entity_id, t.tenant_id, t.maintain_time, t.maintain_user_id, t.maintain_content
, t.valid_flag, t.update_time
FROM t_tool_holder_maintain t
ORDER BY maintain_time DESC
LIMIT 999
) tt
GROUP BY holder_entity_id
结果如下:
发现没,aaa那条记录没了,id相同的去掉了,OK,说明这是可行的!那么有其他更高效正确的写法吗?欢迎老铁们探讨交流