mysql - 需要在mysql中准备一个ranklist

标签 mysql select

我有一张表格,其中包含学生的所有详细信息。我已经为此准备了一个排名程序。 例如:

SELECT name, total_marks, @curRank := IF(@prevVal=total_marks, @curRank, @curRank+1) AS rank,
@prevVal:=total_marks
FROM marks, (
SELECT @curRank :=0, @prevVal:=null, @n:=1
) r
ORDER BY total_marks DESC ;

在此声明中。我需要检查是否有学生具有相同的排名。如果是这样,那么我必须检查特定主题标记并相应地对其进行排序。

最佳答案

我认为你可以这样做 -

SELECT rank, GROUP_CONCAT(name) FROM (
  -- your query goes here
  ...
  ...
  ...
) t
GROUP BY rank

CREATE TABLE marks(
  name VARCHAR(20),
  z INT(10),
  y INT(10),
  total_marks INT(10),
  rank INT(10)
);

INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('abc', 100, 50, 150, 1);
INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('abc', 100, 50, 150, 2);
INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('abc', 100, 50, 150, 3);

INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('def', 100, 50, 150, 1); 
INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('def', 100, 50, 150, 2); 

INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('abcdef', 100, 50, 150, 1);
INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('abcdef', 100, 50, 150, 2);
INSERT INTO marks (name, z, y, total_marks, rank) VALUES ('abcdef', 100, 50, 150, 3);


SELECT rank, GROUP_CONCAT(name) FROM (
  SELECT name, MAX(rank) rank FROM marks GROUP BY name) t
GROUP BY rank;

+------+--------------------+
| rank | GROUP_CONCAT(name) |
+------+--------------------+
|    2 | def                |
|    3 | abc,abcdef         |
+------+--------------------+

用户 abcabcdef 具有相同的排名 (1,2,3)。 用户 def 具有不同的等级 (1,2)。

关于mysql - 需要在mysql中准备一个ranklist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13874169/

相关文章:

mysql - guid 作为主键?

php - 登录后连接到不同的数据库?

mysql - 如何按顶级父类别获取所有项目?

oracle - 选择最后 12 行 oracle

mysql - 从表中选择数据,如果它们重复将其添加到新列中

php - 如何在 PHP 中创建类似 bind_param() 的函数?

mysql - 使用 COUNT 过滤标签

SQL:假设只有两个列,如何比较不同行中的数据并仅选择唯一的 "pairs"?

sql - SQL 语句中不允许的本地集合类型

python - xmppy。文件描述符超出选择范围