澳门葡京网上娱乐:MySQL分组排序,详解MySQL分组排序求Top

MySQL分组排序求Top N

澳门葡京网上娱乐:MySQL分组排序,详解MySQL分组排序求Top。详解MySQL分组排序求Top N,mysqltop

MySQL分组排序求Top N

表结构

 澳门葡京网上娱乐 1

根据grp分组,遵照num排序,每组取Top 3,输出结果如下:

 
 澳门葡京网上娱乐 2

源代码:

SELECT * FROM score AS t3  
WHERE (  
  SELECT COUNT(*) FROM score AS t1  
  LEFT JOIN score AS t2  
  ON t1.grp = t2.grp AND t1.num < t2.num  
  WHERE t1.id = t3.id 
) < 3 
ORDER BY t3.grp ASC, num DESC 

在where中能够通过子查询创设两个新的变量来过滤。

谢谢阅读,希望能支援到咱们,感激大家对本站的援助!

N,mysqltop
MySQL分组排序求Top N 表结构 依据grp分组,依照num排序,每组取Top
3,输出结果如下: 源代码: SELECT * FROM…

MySQL分组排序

一、问题

 

产品表
有平台id 产品名称

id ptid name
1 100 产品1
2 100 产品2
3 100 产品3
4 100 产品4
5 100 产品5
6 100 产品6
7 101 产品7
8 101 产品8
9 101 产品9
10 101 产品10
11 101 产品11

怎么样遵照有个别平台id 只取那几个平台的3条数据(顺序能够任性)

id ptid name
1 100 产品1
2 100 产品2
3 100 产品3
7 101 产品7
8 101 产品8
9 101 产品9

二、建表

 

create table p_a(
  id int,
  ptid varchar(20),
  name varchar(20)
)
insert into p_a(id,ptid,name) values(1,'100','产品1');
insert into p_a(id,ptid,name) values(2,'100','产品2');
insert into p_a(id,ptid,name) values(3,'100','产品3');
insert into p_a(id,ptid,name) values(4,'100','产品4');
insert into p_a(id,ptid,name) values(5,'100','产品5');
insert into p_a(id,ptid,name) values(6,'100','产品6');
insert into p_a(id,ptid,name) values(7,'101','产品7');
insert into p_a(id,ptid,name) values(8,'101','产品8');
insert into p_a(id,ptid,name) values(9,'101','产品9');
insert into p_a(id,ptid,name) values(10,'101','产品10');
insert into p_a(id,ptid,name) values(11,'101','产品11');

三、sql

 

 

select * from (
select a.*,
case when @oldptid=ptid then @lagfield:[email protected]+1 else @lagfield:=1 end rn,
@oldptid:=ptid
from p_a a,(select @lagfield:=0,@oldptid:='') r
) a where rn<=3

 

四、总结

MySQL依据ptid分组,分别对分组内进行标明序号,然后根据序号抽出各分组内的记录

一、难点 产品表 有平台id 产品名称
id ptid name 1 100 产品1 2 100 产品2 3 100 产品3 4 100 产品4 5 100 产品5
6 100 产品6 7 101 产品7 8 1…

  目前,职业中突遇一须求:将一数目表分组,而后收取每组内按自然准则排列的前N条数据。乍想来,那本是平日查询,无甚难处。可提笔写来,究竟是困住了我好一阵子。大费周章,遍查网络,不曾想那仍旧是SQL界的三个优良话题。明天将自己得来的若干主意列出,引玉之砖,以期与众位探究。

表结构

  正文在此之前,对示例表结构加以证实。

 澳门葡京网上娱乐 3

澳门葡京网上娱乐 4

依照grp分组,依据num排序,每组取Top 3,输出结果如下:

                    表SectionTransactionLog,用来记录各部门各式活动的日志表
                     SectionId,部门Id
                     SectionTransactionType,活动类型
                     TotalTransactionValue,活动开销
                     TransactionDate,活动时间

 
 澳门葡京网上娱乐 5

  咱们设定的处境为:选出每单位(SectionId)近期一遍进行的移位。

源代码:

  小编用来测量检验的SectionTransactionLog表中数据超3,000,000。

SELECT * FROM score AS t3  
WHERE (  
  SELECT COUNT(*) FROM score AS t1  
  LEFT JOIN score AS t2  
  ON t1.grp = t2.grp AND t1.num < t2.num  
  WHERE t1.id = t3.id 
) < 3 
ORDER BY t3.grp ASC, num DESC 

一、 嵌套子查询艺术

在where中能够通过子查询创立二个新的变量来过滤。

1

多谢阅读,希望能辅助到我们,多谢大家对本站的补助!

1 SELECT * FROM SectionTransactionLog mLog
2 where 
3     (select COUNT(*) from SectionTransactionLog subLog
4     where subLog.SectionId = mLog.SectionId and subLog.TransactionDate >= mLog.TransactionDate)<=2
5 order by SectionId, TransactionDate desc

相关文章