Mysql 分组以后取每组的前三名数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 分组以后取每组的前三名数据相关的知识,希望对你有一定的参考价值。

mysql> select * from t_subject;
| id | uid | subject |
| 1 | 1 | aa |
| 2 | 2 | bb |
| 3 | 3 | cc |
| 4 | 4 | dd |
| 5 | 2 | ee |
| 6 | 2 | rr |
| 7 | 3 | tt |
| 8 | 2 | yy |
| 9 | 3 | qq |
| 10 | 4 | oo |
| 11 | 3 | pp |
| 12 | 3 | kk |
| 13 | 1 | mm |
| 14 | 4 | nn |
| 15 | 1 | ss |
| 16 | 4 | vv |
| 17 | 1 | ff |

mysql> select uid,group_concat(a.subject) from t_subject a group by a.uid ;

| uid | group_concat(a.subject) |
| 1 | aa,ff,ss,mm |
| 2 | yy,rr,ee,bb |
| 3 | kk,pp,xx,qq,tt,cc |
| 4 | nn,dd,vv,oo |

----我想要的是如下效果的 该怎么写啊(就是取出分组后每组的前三条记录)---
| uid | group_concat(a.subject) |
| 1 | aa,ff,mm |
| 2 | yy,rr,ee |
| 3 | kk,pp,xx |
| 4 | nn,dd,vv |

要排序的啊!用substring不过必须要排序后才能截取啊

参考技术A Try this one,should be fine
下面这个已经有排序了哦,不行么?

SELECT uid, group_concat(subject)
FROM (SELECT id, uid, subject
FROM (SELECT id, uid, subject,
(SELECT COUNT(*)
FROM t_subject
WHERE uid = t.uid
AND subject <= t.subject) RK
FROM t_subject t) t1
WHERE rk <= 3) t2
GROUP BY uid

多了个a.原来
或者你直接用个substring()得了。。。本回答被提问者采纳
参考技术B 不列出表结构及测试数据,只能这样大概写个思路了:

select a.*
from
(
select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段<t1.排序字段) as group_id
from 表 t1
) a
where a.group_id<=3
参考技术C 在后面加上 limit 3
就像这样select * from table limit 3
参考技术D 你这个需求在数据库里面实现起来很麻烦,而且过于复杂效率就会很低,建议你用最简单的方式查出来之后用编程语言来实现是取的三个还是几个!

以上是关于Mysql 分组以后取每组的前三名数据的主要内容,如果未能解决你的问题,请参考以下文章

sql数据库怎么实现分组并取每组的前1条语句,按日期排序?

MySQL取每组的前N条记录

oracle开展分组后,取出每组的前几条数据

Oracle分组查询取每组排序后的前N条记录

mysql分组排序,取每组第一条数据

MySQL分组查询后如何获取每组的前N条数据,你会吗?