在mysql中找到第二个位置

时间:2013-11-16 04:05:24

标签: mysql sql

我需要提取从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

但是除了最高的

之外,它获取了所有标记

4 个答案:

答案 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)