page contents

查询单张表分组后最新的一条记录的其他字段值

目的:查询 category_id 分组下,最新id的 good_name 表结构及数据:goods表

attachments-2020-08-t8Cffojo5f4776a47f872.png

目的:查询 category_id 分组下,最新id的 good_name

表结构及数据:goods表

id  category_id good_name
1   1   3OFUM5jU6w
2   1   2eAHE9yL8S
3   2   QBH6IP9mYg
4   3   fhrnLyFlyu
5   4   er7D2fVjcz
6   5   sY4p0tSmpB
7   6   KrUxx9uhSy
8   7   cLhlDJXoIS
9   8   YdvDIUeGtR
10  9   l23e1HyyIj
11  10  yJNNPXbWzt
12  1   2222222222   


解决方案分析


基础查询:

select max(id) cate_maxid from goods group by category_id


方案:取出最新纪录后再联合查询【可行】

select t1.id, t1.good_name, t1.category_id from goods t1 join (
select max(id) cate_maxid, category_id from goods group by category_id
) as t2 on t1.id = t2.cate_maxid and t2.category_id = t1.category_id;


以下方案不可行。分组后只能取到其他字段升序排序的第一条纪录。


方案一:只分组后取数据【不可行,分组未排序】

select id, good_name, category_id from goods group by category_id;


方案二:排序得到结果集后再分组【不可行,分组对排序后结果集无效】

select t2.id, t2.good_name, t2.category_id from (
select * from goods order by id desc
) t2 GROUP BY t2.category_id;


方案三:与方案二雷同,排序得到结果集后再联合查询并分组【不可行,分组对排序后结果集无效】

select t1.id, t1.good_name, t1.category_id from goods t1 join (
select * from goods order by id desc
) as t2 on t1.id = t2.id group by t2.category_id;


方案四:与方案三雷同,不过调换排序结果集的位置【不可行 ,分组对排序后结果集无效】

select t1.id, t1.good_name, t1.category_id from (
select * from goods order by id desc
) as t2 join goods t1 on t1.id = t2.id group by t2.category_id;


方案五:与方案二雷同,排序得到的结果集放到 in 查询中再分组【不可行 ,分组对排序后结果集无效】

select t1.id, t1.good_name, t1.category_id from goods t1
where id in (select id from goods order by id desc) group by t1.category_id;


20200424 补充:在网上找到具体原因的解释了:实际是跟 mysql 版本有关:https://bugs.mysql.com/bug.php?id=80131


attachments-2020-08-EQWhDZa35f477572e613b.jpg

  • 发表于 2020-08-27 16:58
  • 阅读 ( 766 )
  • 分类:操作系统

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章