group by分组查询最新记录

在网上也看了一些帖子,但是实际操作时仍有一些问题,麻烦各位看看究竟是什么问题。
需求是查询tp_inventory_log表中的每项物资(goods_id)的最新记录(add_time);
我尝试的第一条语句:

 select * from (select goods_id, price, add_time from tp_inventory_log order by add_time desc limit 50) as til group by goods_id order by add_time desc limit 25;

显示结果是
图片描述

第二条查询语句:

 select * from (select goods_id, price, add_time from tp_inventory_log order by add_time desc) as til group by goods_id order by add_time desc limit 25;

显示结果是
图片描述

而这两条语句差别仅仅是第一条语句中的子查询语句多了limit 50,结果却大相径庭。
1.第二条查询语句结果未显示4月23日的数据;
2.goods_id为1081的记录在两条语句查询中显示的结果不一致,希望的结果是第一条查询语句得到的17:14那个。

阅读 5.6k
3 个回答

给你个我的示例,你自己处理一下:

select group_concat(id) id_list,name from ttt group by name; 分组取出所有id,逗号分隔
select group_concat(id order by id SEPARATOR '_') from ttt group by name; 分组取出所有id,逗号分隔并排序,自定义分隔符"_"
select substring_index(group_concat(id order by id SEPARATOR '_'),'_',2) from ttt group by name; 分组取出所有id,逗号分隔并排序取前两个,自定义分隔符"_"
注意一点:group_concat的字段是int型时需要转成字符型,否则可能出现结果不对的情况

SELECT goods_id, price, add_time FROM tp_inventory_log WHERE 主键ID IN (SELECT max(主键ID) FROM tp_inventory_log GROUP BY goods_id) DESC LIMIT 25;
自增主键越大——时间越大,可以考虑下这样的思路

参考下以下代码:
获取所有订单项里最新的一条售后记录:
自连接不需要group by

SELECT 
  `order_refund`.*
FROM
  `order_refund` 
 LEFT JOIN `order_refund` ort 
    ON `ort`.`order_item_id` = `order_refund`.`order_item_id` 
    AND `order_refund`.`id`  < `ort`.`id` 
WHERE `ort`.`id` IS NULL 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题