问题描述
这是执行此操作的一种方法,使用UNION ALL
(参见SQL Fiddle with
Demo)。这适用于两个组,如果您有两个以上的组,那么您需要指定group
数量并为每个组添加查询group
:
(
select *
from mytable
where `group` = 1
order by age desc
LIMIT 2
)
UNION ALL
(
select *
from mytable
where `group` = 2
order by age desc
LIMIT 2
)
有多种方法可以做到这一点,请参阅本文以确定适合您情况的最佳路线:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per- group-in-sql/
编辑:
这也可能对您有用,它会为每条记录生成一个行号。使用上面链接中的示例,这将仅返回那些行号小于或等于 2 的记录:
select person, `group`, age
from
(
select person, `group`, age,
(@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number
from test t
CROSS JOIN (select @num:=0, @group:=null) c
order by `Group`, Age desc, person
) as x
where x.row_number <= 2;
看演示
解决方法
以下是最简单的示例,尽管任何解决方案都应该能够扩展到需要许多 n 个顶级结果:
给定下面这样的表格,其中包含人员、组和年龄列,您将如何 获得每个组中年龄最大的 2 人? (组内的关系不应产生更多结果,但按字母顺序给出前 2 个)
+--------+-------+-----+
| Person | Group | Age |
+--------+-------+-----+
| Bob | 1 | 32 |
| Jill | 1 | 34 |
| Shawn | 1 | 42 |
| Jake | 2 | 29 |
| Paul | 2 | 36 |
| Laura | 2 | 39 |
+--------+-------+-----+
Desired result set:
+--------+-------+-----+
| Shawn | 1 | 42 |
| Jill | 1 | 34 |
| Laura | 2 | 39 |
| Paul | 2 | 36 |
+--------+-------+-----+
注意: 这个问题建立在前一个问题的基础上——为每组分组的 SQL
结果获取具有最大值的记录——用于从每组中获取一个顶行,并且从@Bohemian
获得了一个很好的 MySQL 特定答案:
select *
from (select * from mytable order by `Group`,Age desc,Person) x
group by `Group`
希望能够以此为基础,尽管我不知道如何。