我正在开发一个应用程序,用户可以进行在线考试,然后他们需要知道该应用程序中所有考试的排名。
参加考试后,我需要根据两行获取特定用户的排名(usuario),要获得排名的第一行必须是较大的(puntuacion),如果是相同的(puntuacion),则第二行要考虑的是特定考试科目(材料)的较小值(范围)。
我需要您的帮助来创建所需的查询。
答案 0 :(得分:3)
您希望结果按“ puntuacion”和“ duracion”排序。这是通过order by
SELECT * FROM your_table ORDER BY puntuacion DESC, duracion ASC
尚不清楚如何对它进行排序,因此您可能不得不在ASC
和DESC
之间切换。
如果要添加行号并具有足够高的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
然后我只需要过滤所需的字段即可。