如果我有一个像USER这样的表
class | age
--------------
1 20
3 56
2 11
1 12
2 20
Run Code Online (Sandbox Code Playgroud)
然后我可以轻松地通过每个班级获得最年轻的用户
select class, min(age)
from user
group by class;
Run Code Online (Sandbox Code Playgroud)
同样,通过用max替换min,我可以得到最老的.但是我怎样才能获得每个班级中最年轻(或最老)的第10名?顺便说一下,我正在使用MySql v.5.0.
干杯,
Pao*_*ino 21
SELECT a.class,
(
SELECT b.age
FROM users b
WHERE b.class = a.class
ORDER BY age
LIMIT 1,1
) as age
FROM users a
GROUP BY a.class
Run Code Online (Sandbox Code Playgroud)
在每堂课中获得第二名最年轻的学生.如果你想要第10个最年轻的,你会这样做LIMIT 9,1,如果你想要第10个最老的,那你就做了ORDER BY age DESC.
Dev*_*hah 11
这里N有Nth记录oldest
SELECT *
FROM users k
WHERE N = (SELECT
COUNT( DISTINCT age)
FROM users u
WHERE k.age >= u.age
AND k.class = u.class
GROUP BY u.class)
Run Code Online (Sandbox Code Playgroud)
它给出了Nth记录youngest
SELECT *
FROM users k
WHERE N = (SELECT
COUNT(DISTINCT age)
FROM users u
WHERE k.age <= u.age
AND k.class = u.class
GROUP BY u.class)
Run Code Online (Sandbox Code Playgroud)
唯一独立于sql的方式(即使你没有子查询mysql <5)
select u1.class, u1.age, count(*) from user u1 join user u2
on u1.class = u2.class and u1.age >= u2.age
group by u1.class, u1.age
having count(*) = [number]
Run Code Online (Sandbox Code Playgroud)
为您提供每堂课中年龄最大的 [number] 名
select u1.class, u1.age, count(*) from user u1 join user u2
on u1.class = u2.class and u1.age <= u2.age
group by u1.class, u1.age
having count(*) = [number]
Run Code Online (Sandbox Code Playgroud)
让你成为每班最年轻的 [number] 名
如果两个人年龄相同,则可能无法正常工作,因为两人都会被退回。如果您只想返回其中之一,则需要一个唯一的键,并且查询会更复杂。
在 SQL Server 中这非常简单:
Run Code Online (Sandbox Code Playgroud)select * from( select *, row_number() over(order by age asc) as eldest from class order by age asc) a where a.eldest = 10
按照这种模式,对于MySQL,我想你想看看这个:http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/