mysql - 在 SQL 查询中配对

标签 mysql sql

最近开始接触SQL,对下面的东西很好奇

有一个表 T,包含以下两列:

学生姓名、成绩

表中有偶数行,我们称这个数为2N

有什么简单的方法可以创建一个包含以下行的新表:

最高分的名字,最高分,最低分的名字,最低分

第二高分的名字,第二高分,第二低分的名字,第二低分

第三高分的名字,第三高分,第三低分的名字,第三低分
.
.
.
.
.
第N高分的名字,第N高分,第N低分的名字,第N低分

所以总共会有 N 行。

或者这种类型的工作不适合SQL?

很容易首先列出第 1 到第 N 个最高得分者,然后列出第 1 到第 N 个最低得分者,但我不确定是否有一种方法可以像上面那样在 SQL 中很好地加入它们。

最佳答案

您可以按分数的升序和降序计算行号,并在行号相等的条件下加入它们。

SELECT X.NAME,
       X.SCORE,
       Y.NAME,
       Y.SCORE
FROM
 (SELECT NAME,SCORE,@RN_ASC:=@RN_ASC+1 AS RNUM
  FROM T
  CROSS JOIN (SELECT @RN_ASC:=0) R
  ORDER BY SCORE) X
JOIN
 (SELECT NAME,SCORE,@RN_DESC:=@RN_DESC+1 AS RNUM
  FROM T
  CROSS JOIN (SELECT @RN_DESC:=0) R
  ORDER BY SCORE DESC) Y 
ON X.RNUM = Y.RNUM AND X.SCORE>Y.SCORE

如果表格中有奇数 (n) 行,则中间行 ((n/2)+1 th) 将被跳过。

如果得分相同,使用 name 列来打破平局,即选择一个名字而不是另一个(通过在 order by 中指定名字升序或降序>).

SELECT X.NAME,
       X.SCORE,
       Y.NAME,
       Y.SCORE
FROM
 (SELECT NAME,SCORE,@RN_ASC:=@RN_ASC+1 AS RNUM
  FROM T
  CROSS JOIN (SELECT @RN_ASC:=0) R
  ORDER BY SCORE,NAME) X
JOIN
 (SELECT NAME,SCORE,@RN_DESC:=@RN_DESC+1 AS RNUM
  FROM T
  CROSS JOIN (SELECT @RN_DESC:=0) R
  ORDER BY SCORE DESC,NAME) Y 
ON X.RNUM = Y.RNUM AND X.SCORE>Y.SCORE

关于mysql - 在 SQL 查询中配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42321077/

相关文章:

mysql - 仅对 MYSQL 中的某些特定值进行分组和更新

c# - 如何使用C#在T-SQL脚本中转换中文单词(下午/上午)的数据格式(基于SQL Server中文版)

sql - 如何知道应该在哪里使用 AS 关键字?

php - 检查用户名是否存在

mysql - 如何在 SELECT 子句中命名列别名后立即使用它?

MySQL备份命令不起作用

sql - dropdb mydb 在 postgres 中不工作

php - MySQL查询结果

mysql - 数据库架构 : Key/Value table or all keys in one record

mysql - 如何编写一个引用表中字段的 MySQL 函数?