查询以基于两行获取用户在数据库表中的排名

时间:2018-10-09 08:46:06

标签: php mysqli

我正在开发一个应用程序,用户可以进行在线考试,然后他们需要知道该应用程序中所有考试的排名。

这是数据库表结构: enter image description here

参加考试后,我需要根据两行获取特定用户的排名(usuario),要获得排名的第一行必须是较大的(puntuacion),如果是相同的(puntuacion),则第二行要考虑的是特定考试科目(材料)的较小值(范围)。

我需要您的帮助来创建所需的查询。

3 个答案:

答案 0 :(得分:3)

您希望结果按“ puntuacion”和“ duracion”排序。这是通过order by

完成的

SELECT * FROM your_table ORDER BY puntuacion DESC, duracion ASC

尚不清楚如何对它进行排序,因此您可能不得不在ASCDESC之间切换。

如果要添加行号并具有足够高的MariaDB / Mysql-Version(Mysql 8.0),则可以使用窗口函数:https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html

SELECT ROW_NUMBER() OVER (ORDER BY puntuacion DESC, duracion ASC) as row, * FROM your_table ORDER BY puntuacion DESC, duracion ASC

答案 1 :(得分:1)

假设用户是唯一的(如果需要按升序排序,请删除DESC):

SELECT * FROM tableName ORDER BY puntuacion DESC, duracion DESC;

以数组形式获取它,并使用$result[array_search($user)]获取行。尚未经过测试,但可以正常工作。

如果您有很多用户(每次都会加载每个用户),这有点麻烦,但是我看不到其他解决方案。

答案 2 :(得分:0)

我有一个有效的查询:

SELECT t.*, @rownum := @rownum + 1 AS rank FROM tb_examenes t, (SELECT @rownum := 0) r WHERE materia = 10 ORDER by puntuacion DESC, duracion ASC

然后我只需要过滤所需的字段即可。