查詢單張表分組後最新的一條記錄的其餘字段值

attachments-2020-08-t8Cffojo5f4776a47f872.png

目的:查詢 category_id 分組下,最新id的 good_namephp

表結構及數據:goods表mysql

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

解決方案分析

基礎查詢:sql

select max(id) cate_maxid from goods group by category_id

方案:取出最新紀錄後再聯合查詢【可行】spa

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;

如下方案不可行。分組後只能取到其餘字段升序排序的第一條紀錄。code

方案一:只分組後取數據【不可行,分組未排序】排序

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

方案二:排序獲得結果集後再分組【不可行,分組對排序後結果集無效】rem

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

方案三:與方案二雷同,排序獲得結果集後再聯合查詢並分組【不可行,分組對排序後結果集無效】get

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;

方案四:與方案三雷同,不過調換排序結果集的位置【不可行 ,分組對排序後結果集無效】it

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 查詢中再分組【不可行 ,分組對排序後結果集無效】class

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

相關文章
相關標籤/搜索