Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中找到第二个位置_Mysql_Sql - Fatal编程技术网

在mysql中找到第二个位置

在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

我需要把从一年级到十二年级排名第二的学生的名字拉出来。每个年级都有具有类似表结构的独立数据库

我有以下数据:

第1组

第2组

我需要一个查询,可以说uid 3,4在集合1中是第二位的,3,4,6在集合2中是第二位的。 我需要在单个查询中使用它,因为有多组数据库

可能的方法是什么

我试过:

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)