MySql分组取前N记录

222256_e9IV_3496297.png

SELECT * 
from stu_score s
WHERE 2 > (SELECT COUNT(*) from stu_score t WHERE t.class = s.class AND t.score > s.score)
ORDER BY s.class,s.score DESC

特例N=1,即取最大/最小的一条记录

SELECT * 
from stu_score s
WHERE NOT EXISTS (SELECT 1 from stu_score t WHERE t.class = s.class AND t.score > s.score)
SELECT * 
from stu_score s
WHERE NOT EXISTS (SELECT 1 from stu_score t WHERE t.class = s.class AND t.score < s.score)

引申:

有表A 
ID    Name
1     小明
2     大明
3     三明
4     四明


表B 
ID     AID   Type    date
1      1     a       2013-01-01
2      1     b       2013-01-02
3      2     a       2013-05-01
4      2     b       2013-03-02
5      3     a       2013-12-01
6      3     b       2013-01-08
7      3     a       2013-03-01
8      4     b       2013-02-02

表B的 AID是表A的外键  

现要求查出
A表的Name        B表ID    B表的最后一个时间的Data     B表的最后一个时间的Type
小明               2      2013-01-02                       b
大明               3      2013-05-01                       a
三明               5     2013-12-01                        a
四明               8      2013-02-02                       b


表A关联表B的相应最大时间的记录,并且可以根据 表B的Type进行筛选数据

select a.NAME,b.id,b.[date],b.[type]
from [A] INNER JOIN b  ON a.id=b.aid
WHERE EXISTS (SELECT 1 FROM (SELECT aid,MAX([date])[date] FROM  b GROUP BY aid) c WHERE b.aid=c.aid AND c.[date]=b.[date])
--AND b.TYPE=xxxx

 

转载于:https://my.oschina.net/u/3496297/blog/1557934

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值