Mi orden de clasificación no es correcto, ¿en qué parte de esta consulta el orden no coincide con la clasificación?
SELECT @r := @r+1 as rank, z.* FROM( SELECT u.user_id, u.score, c.username FROM `e_highscores` u JOIN ( SELECT cc.user_id, cc.username FROM e_users as cc ) as c ON u.user_id = c.user_id ORDER BY u.score DESC )z, (SELECT @r:=0)y;Producción:
Cambiando el orden por a:
SELECT @r := @r+1 as rank, z.* FROM( SELECT u.user_id, u.score, c.username FROM `e_highscores` u JOIN ( SELECT cc.user_id, cc.username FROM e_users as cc ) as c ON u.user_id = c.user_id )z, (SELECT @r:=0)y ORDER BY z.score DESCProduce:
Creo una tabla en mi sandbox (mysql 5.7.31), y parece que su consulta podría obtener el resultado correcto:
CREATE TABLE `e_highscores` ( `user_id` int(11) NOT NULL, `score` int(11) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB; CREATE TABLE `e_users` ( `user_id` int(11) NOT NULL, `username` varchar(255) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB; insert into `e_highscores` (user_id, score) values (2, 200), (15, 300), (11,121); insert into `e_users` (user_id, username) values (2, 'Pie'), (15, 'Adam'), (11, 'Hershey'); SELECT @r := @r+1 as urank, z.* FROM( SELECT u.user_id, u.score, c.username FROM `e_highscores` u JOIN e_users as c ON u.user_id = c.user_id ) z, (SELECT @r:=0) y ORDER BY z.score DESC;El resultado es:
1 15 300 Adam 2 2 200 Pie 3 11 121 Hershey¿Supongo que su problema puede ser causado por la palabra clave 'rango' en mysql? ¿Podría decirme su versión de mysql, por favor?
mariadb es diferente con mysql cuando se usa una variable definida por el usuario con order by juntos.
Tenga cuidado con el orden de evaluación de las filas al ordenar. Parecería (al menos hasta donde lo he probado) que cuando las declaraciones de la forma:
SELECCIONE @var:= DESDE...
se ejecutan, @var siempre corresponderá al valor de la última fila devuelta, como era de esperar.
Pero si haces algo como:
SELECCIONE DISTINCT IFNULL(@var:=Name,'unknown') FROM Clientes ORDEN POR LÍMITE 10
La instrucción que contiene la asignación de la variable se ejecutará antes que la orden por . En este caso, el valor que queda en @var al final podría no corresponder a ninguna de las filas devueltas.
Consulte el documento oficial de mariadb para obtener más detalles.
Para generar el resultado correcto, utilice la siguiente consulta:
select urank, t.user_id, t.score, c.username from ( select @row := @row + 1 as urank, u.user_id, u.score from e_highscores u order by score desc ) t join e_users as c on t.user_id = c.user_id order by score desc;