range de mysql por valor de columna agrupado por valor de columna

Estoy tratando de averiguar cómo clasificar en base a 2 numbers de columnas diferentes en laravel, pero lo hará mysql en bruto. Tengo una list de videos, estos videos están dentro de las competiciones y reciben votos si a alguien le gusta el video. Cada video tendrá un número de voto y un número de competencia. Estoy tratando de clasificar en function de los votos dentro de la competencia. Entonces, por ejemplo, debajo de la competencia 8, necesito el range de todos los videos en esa competencia en function de los votos. Entonces necesito lo mismo para la competencia 5, etc.

|rank|votes|competition| ------------------ | 1 | 100 | 8 | ------------------ | 2 | 50 | 8 | ------------------ | 3 | 30 | 5 | ------------------ | 1 | 900 | 5 | ------------------ | 2 | 35 | 5 | ------------------ 

He intentado varios methods de grupo y selectby pero nada parece funcionar, ¿alguna idea?

En Mysql puede usar variables definidas por el usuario para calcular el range, verificaciones de declaraciones de casos si la competencia es la misma que la fila anterior, luego incrementar el range en uno si es diferente y luego asignarle 1 a una order para tener el range correcto para el video

  SELECT t.*, @current_rank:= CASE WHEN @current_rank = competition THEN @video_rank:=@video_rank +1 ELSE @video_rank:=1 END video_rank, @current_rank:=competition FROM t , (SELECT @video_rank:=0,@current_rank:=0) r ORDER BY competition desc, votes desc 

Ver demostración

Si está confundido con la última columna adicional, puede usar una subselección

Ver demostración

Puede usar funciones de window:

 select competition, votes, rank() over (partition by competition order by votes desc) as rank from table1