关于 group by 取最新一条数据的方法

背景

做一个有关产品入库最后一次入库产品(最新的记录)的筛选,本意是想通过 group by 取得最后一条(MySql 5.7.30)

原数据:

需要取id 5441678, 所以立马写出这样的SQL:

select id, item_code,  order_no
from goods_log
where item_code in ('PZI209HP-C')
group by item_code

运行结果为:

没取到想要的那一列,于是再给它加一个 order by id 的排序:

select id, item_code,  order_no
from goods_log
where item_code in ('PZI209HP-C')
group by item_code
order by id desc;

但结果还是和之前一样:

上网查了下,可以通过 MAX 的方法来筛选ID,获得最新的哪一行,所以写下SQL:

select max(id), (order_no)
from goods_log
where item_code = 'PZI209HP-C'
group by item_code
order by id desc;

结果:

咋一看以为是对了,仔细一看, order_no 不对,这条SQL 单单只是把 id 最新的列出来了,既然可以拿到最新的 id,
那么 可以通过 子查询 的方式…,于是改进SQL

select  id, item_code,  order_no
from goods_log
where id in (select max(id) as id from goods_log where item_code in ('PZI209HP-C') group by item_code)

执行结果:

目的达到了,但应该还有更好的 更优雅的 方法吧,有其它更好的方法吗?

天高地迥,觉宇宙之无穷;兴尽悲来,识盈虚之有数。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 15
chowjiawei
3年前 评论
bigbug-gg (楼主) 3年前
王小大 3年前
bigbug-gg (楼主) 3年前
bigbug-gg (楼主) 3年前
王小大 3年前

select * from goods_log where item_code = 'PZI209HP-C' order by id desc limit 1

3年前 评论
SELECT l.id, l.item_code, l.order_no
FROM goods_log l
    JOIN (
        SELECT MAX(id) AS id
        FROM goods_log
        WHERE item_code IN ('PZI209HP-C')
        GROUP BY item_code
    ) sub
    ON l.id = sub.id

用关联查询效率应该比子查询高一点,不过如果只是查一条记录的最新信息,直接用@落叶满长安 的方法就行了,不用写这么复制。

3年前 评论
bigbug-gg (楼主) 3年前

是我想的简单了吗? order by id desc limit 1 不可以吗

3年前 评论
bigbug-gg (楼主) 3年前

@Su 如果id不是有序的递增呢?如果id是乱序的唯一编码呢。order by 就没用了吧。

3年前 评论
Su 3年前

你这个问题很经典,我也遇到过,专门写了这个:laravel 分组中取最大最小的记录

3年前 评论
bigbug-gg (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!