在mysql中找到第二个位置
我需要把从一年级到十二年级排名第二的学生的名字拉出来。每个年级都有具有类似表结构的独立数据库 我有以下数据: 第1组 第2组 我需要一个查询,可以说uid 3,4在集合1中是第二位的,3,4,6在集合2中是第二位的。 我需要在单个查询中使用它,因为有多组数据库 可能的方法是什么 我试过:在mysql中找到第二个位置,mysql,sql,Mysql,Sql,我需要把从一年级到十二年级排名第二的学生的名字拉出来。每个年级都有具有类似表结构的独立数据库 我有以下数据: 第1组 第2组 我需要一个查询,可以说uid 3,4在集合1中是第二位的,3,4,6在集合2中是第二位的。 我需要在单个查询中使用它,因为有多组数据库 可能的方法是什么 我试过: SELECT * FROM TBL WHERE marks ! = SELECT MAX(marks) from tbl 但它获得了除最高的使用限制和顺序之外的所有分数 SELECT * FROM TBL
SELECT * FROM TBL WHERE marks ! = SELECT MAX(marks) from tbl
但它获得了除最高的使用限制和顺序之外的所有分数
SELECT * FROM TBL ORDER BY marks DESC LIMIT 1,1
在那里,你把所有的学生按分数从高到低排序。然后限制从第二个0返回的是第一条记录,并且只返回一条记录
如果需要所有有第二个标记的学生,则使用子查询
SELECT * FROM TBL WHERE marks = (
SELECT marks FROM TBL ORDER BY marks DESC GROUP BY marks LIMIT 1,1
)
试试这个:
SELECT uid, marks FROM (
SELECT uid, marks, @rank := @rank + (@prevMarks != marks) rank, @prevMarks := marks
FROM t, (SELECT @rank := 0, @prevMarks := 0) init
ORDER BY marks
) s
WHERE rank = 2
小提琴
没有用户定义变量的另一个备选方案:
SELECT t.uid, t.marks FROM t
JOIN (
SELECT DISTINCT marks FROM t
ORDER BY marks
LIMIT 1, 1
) s
ON t.marks = s.marks
输出:
| UID | MARKS |
|-----|-------|
| 3 | 17 |
| 4 | 17 |
试试这个
SELECT t.marks, t.uid, (
SELECT COUNT( marks ) +1
FROM tbl t1
WHERE t.marks < t1.marks
) AS rank
FROM tbl t
LIMIT 0 , 30
现在,您可以使用下面经过位修改的秩列
SELECT * from (
SELECT t.marks, t.uid, (
SELECT COUNT( marks ) +1
FROM tbl t1
WHERE t.marks < t1.marks
) AS rank
FROM tbl t
) alias where rank=n (2 here)
这个问题被要求调出所有得分第二高的记录……因为这是第二高的分数。我采取了最直观的方法。也可以移植到其他数据库,而无需更改查询本身。但是我意识到还有其他更具扩展性的方法可以做到这一点。你确定这会奏效吗?我做了一个测试,但它没有发挥应有的作用。如果有一个或多个学生的分数相同,那么你的递增实际上造成了损害。我只是想知道为什么这一个被接受。如果第一个学生超过一个,那么肯定不会有第二个。假设一个班里有两个男生得分最高,那么就不会有第二名了。将有2个第一位置,然后是第三位置,而不是第二位置。事实并非如此。我正在使用OP的数据,但它没有按照OP的要求显示。
SELECT *
FROM table
WHERE mark = (
SELECT MAX(mark)
FROM table
WHERE mark <
(
SELECT MAX(mark)
FROM table
)
)
SELECT t.marks, t.uid, (
SELECT COUNT( marks ) +1
FROM tbl t1
WHERE t.marks < t1.marks
) AS rank
FROM tbl t
LIMIT 0 , 30
SELECT * from (
SELECT t.marks, t.uid, (
SELECT COUNT( marks ) +1
FROM tbl t1
WHERE t.marks < t1.marks
) AS rank
FROM tbl t
) alias where rank=n (2 here)