我需要提取从1年级到12年级的第二职位的学生的姓名。每个年级都有独立的数据库,具有相似的表格结构
我有以下数据:
设置1
uid marks
1 10
2 20
3 17
4 17
5 20
6 20
设置2
uid marks
1 10
2 20
3 17
4 17
5 20
6 17
7 20
我需要一个查询,可以说uid 3,4在第1组中排名第二,3,4,6在第2组中排名第二。 我需要在一个查询中,因为有几组数据库
可能的方式是什么?
我试过了:
SELECT * FROM TBL WHERE marks ! = SELECT MAX(marks) from tbl
但是除了最高的
之外,它获取了所有标记答案 0 :(得分: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
小提琴here。
没有用户定义变量的另一种选择:
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 |
答案 1 :(得分:0)
使用LIMIT和ORDER BY
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
)
答案 2 :(得分:0)
SELECT *
FROM table
WHERE mark = (
SELECT MAX(mark)
FROM table
WHERE mark <
(
SELECT MAX(mark)
FROM table
)
)
答案 3 :(得分:0)
试试这个
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)