分组查询取每组前n条记录实例

本文介绍三种SQL查询方法,用于从运动员比赛成绩表中找出每个国家的前三名成绩记录,并提供了一个具体的查询案例。

假设有这样一张运动员比赛成绩表 tb_score 


现在要求查询出每个国家的前三名的成绩记录,查询语句可以这样写:

1、

[sql]  view plain  copy
  1. select t3.id,t3.country,t3.score   
  2. from (select t1.*, (select count(*) from tb_score t2 where t1.score<=t2.score and t1.country=t2.country) as rownum   
  3.             from tb_score t1) t3   
  4. where rownum <=3 order by country,score DESC;  


2、

[sql]  view plain  copy
  1. select a.id,a.country,a.name,a.score from tb_score a   
  2. where exists   
  3. (select count(*) from tb_score where country = a.country and score > a.score having Count(*) < 3)  
  4. order by a.country,score DESC;  

3、

[sql]  view plain  copy
  1. select a.id,a.country,a.name,a.score from tb_score a   
  2. where   
  3. (select count(*) from tb_score where country = a.country and score > a.score )<3  
  4. order by a.country,score DESC;  

查询结果如下:


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/zhutulang/article/details/48680379

参考资源链接:[MySQL GROUP BY 分组每组N记录种方法](https://wenku.youkuaiyun.com/doc/6453096cea0840391e76c7b3?utm_source=wenku_answer2doc_content) 在MySQL数据库中,通过GROUP BY语句可以实现对数据的分组统计,但当需要对每个分组N记录时,就需要运用一些高级的SQL技巧。首先,值得推荐的是查看资源《MySQL GROUP BY 分组每组N记录种方法》,它为你提供了多种解决方案,直接关联到你当的问题,并能帮助你高效地解决分组记录的需求。 以下是使用JOIN、子查询、LIMIT等技术来实现这一需求的详细步骤: 1. 使用LEFT JOIN结合HAVING子句: 这种方法适用于需要对每个分组N记录的场景。通过LEFT JOIN连接同一表的副本来为每个记录找到同组中其他具有更高值的记录。然后通过HAVING子句来筛选出在每个分组中高于其值的记录数少于N的记录。 示例代码如下: ```sql SELECT t.* FROM your_table t LEFT JOIN your_table t2 ON t.grouping_column = t2.grouping_column AND t.value_column < t2.value_column GROUP BY t.id HAVING COUNT(t2.id) < N ORDER BY t.grouping_column, t.value_column DESC; ``` 2. 使用子查询(嵌套查询): 通过在WHERE子句中使用子查询,可以获每个分组N记录。子查询会返回每个分组中排名在N的记录的ID,然后主查询根据这些ID获完整记录。 示例代码如下: ```sql SELECT * FROM your_table WHERE id IN ( SELECT id FROM your_table GROUP BY grouping_column ORDER BY value_column DESC LIMIT N ) ORDER BY grouping_column, value_column DESC; ``` 3. 使用LIMIT子句结合子查询: 这种方法需要更加小心地构造子查询,确保能够正确地返回每个分组N记录的ID或记录本身。需要注意的是,这种方法在某些情况下可能会导致错误,因此可能需要额外的逻辑来确保查询的准确性。 示例代码如下: ```sql SELECT * FROM your_table t WHERE (t.grouping_column, t.value_column) IN ( SELECT grouping_column, value_column FROM your_table GROUP BY grouping_column ORDER BY value_column DESC LIMIT N ) ORDER BY t.grouping_column, t.value_column DESC; ``` 在实际应用中,选择哪一种方法决于具体的数据规模和性能要求。在处理大规模数据时,确保为分组和排序字段建立适当的索引是非常重要的。此外,每种方法都有其适用场景和潜在的性能影响,建议根据实际情况进行选择和优化。 对于希望深入学习MySQL中分组记录技术的读者,除了面提到的《MySQL GROUP BY 分组每组N记录种方法》外,还可以查阅更多关于SQL查询优化和高级查询技术的资料,以便更好地理解和掌握这类复杂查询的实现。 参考资源链接:[MySQL GROUP BY 分组每组N记录种方法](https://wenku.youkuaiyun.com/doc/6453096cea0840391e76c7b3?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值