mysql 取最大n条记录_【SQL】MySQL分组取最大(最小、最新、前N条)条记录

在数据库开发过程中,我们要为每种类型的数据取出前几条记录,或者是取最新、最小、最大等等,这个该如何实现呢,本文章向大家介绍如何实现mysql分组取最大(最小、最新、前N条)条记录。需要的可以参考一下。

示例中需要使用到的数据

创建代码如下:

create table tb(name varchar(10),val int,memo varchar(20));

insert into tb values('a', 2, 'a2');

insert into tb values('a', 1, 'a1');

insert into tb values('a', 3, 'a3');

insert into tb values('b', 1, 'b1');

insert into tb values('b', 3, 'b3');

insert into tb values('b', 2, 'b2');

insert into tb values('b', 4, 'b4');

insert into tb values('b', 5, 'b5');

数据表如下:

name

val

memo

a

2

a2

a

1

a1

a

3

a3

b

1

b1

b

3

b3

b

2

b2

b

4

b4

b

5

b5

按name分组取val最大的值所在行的数据

方法一:

select a.* from tb a

where val = ( select max(val) from tb where name = a.name)

order by a.name

方法二:

select a.* from tb a

inner join

(

select name , max(val) val from tb group by name

) b

on a.name = b.name

and a.val = b.val

order by

方法三:

select a.*

from tb a, ( select name,max(val) val from tb group by name ) b

where a.name = b.name

and a.val = b.val

order by a.name

方法四:

select a.* from tb a

where not exists (select 1 from tb where name = a.name and val > a.val)

方法五:

select a.* from tb a

where 1 > ( select count(*) from tb where name = a.name and val > a.val )

order by a.name

以上五种方法运行的结果均为如下所示:

name

val

memo

a

3

a3

b

5

b5

结果显示第1,2,3种方法效率较高,第4,5种方法效率差些。

按name分组取val最大的2个(N个)值所在行的数据

第一种方法:

select a.*

from tb a

where val in

(

select top 2 val from tb where name=a.name order by val desc

)

order by a.name,a.val

第二种方法:

select a.*

from tb a

where 2 > ( select count(*) from tb where name = a.name and val > a.val )

order by a.name,a.val

第三种方法:

select a.*

from tb a

where exists

(

select count(*) from tb where name = a.name and val > a.val having Count(*) < 2

)

order by a.name

结果如下:

name

val

memo

a

3

a3

a

2

a2

b

5

b5

b

4

b4

按name分组取第一次出现的行所在的数据

sql如下:

select a.*

from tb a

where val = (select top 1 val from tb where name = a.name)

order by a.name

结果如下:

name

val

memo

a

2

a2

b

1

b1

按name分组随机取一条数据

sql如下:

select a.*

from tb a

where val = (select top 1 val from tb where name = a.name order by newid())

order by a.name

结果如下:

name

val

memo

a

1

a1

b

3

b3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值