(Reimpreso) Implementación de la función de clasificación avanzada de rango en MySQL

Reproducido: Enlace: http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql/
Negación: Si violo los derechos de nadie, por favor, póngase en contacto conmigo y voy a eliminarlo.
Expertos de bienvenida para rociar I


No hay una función de clasificación de clasificación en MySQL. Cuando necesitamos consultar la clasificación, solo podemos usar la declaración de consulta básica en la base de datos MySQL para consultar la clasificación general. Sin embargo, no subestime las declaraciones de consulta básicas y simples, podemos usarlas para lograr el mismo efecto de clasificación avanzada que la función de clasificación.

Aquí uso un ejemplo simple para implementar la consulta de clasificación:

Primero, primero creamos una tabla de jugadores que necesitamos para realizar consultas de clasificación avanzadas.

CREATE TABLE `players` (
  `pid` int(2) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(2) NOT NULL,
  PRIMARY KEY (`pid`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO `players` (`pid`, `name`, `age`) VALUES
(1, 'Samual', 25),
(2, 'Vino', 20),
(3, 'John', 20),
(4, 'Andy', 22),
(5, 'Brian', 21),
(6, 'Dew', 24),
(7, 'Kris', 25),
(8, 'William', 26),
(9, 'George', 23),
(10, 'Peter', 19),
(11, 'Tom', 20),
(12, 'Andre', 20);

1. Implementar la función de clasificación ordinaria Rank en MySQL

Aquí, queremos obtener una columna del campo de clasificación y el orden ascendente de edad. Entonces nuestra declaración de consulta será:


SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age

Salida:

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    3 |
|   3 |    John |  20 |    4 |
|  11 |     Tom |  20 |    5 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   11 |
|   8 | William |  26 |   12 |

Para declarar una variable en mysql, debe usar el símbolo @ antes del nombre de la variable. La parte (@curRank: = 0) de la cláusula FROM nos permite inicializar variables sin la necesidad de un comando SET separado. Por supuesto, SET también se puede usar, pero manejará dos consultas:

SET @curRank := 0;
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players
ORDER BY age

2. La consulta se ordena en orden descendente.

En primer lugar, ordene por edad en orden descendente y, en segundo lugar, por nombre, simplemente modifique la declaración de consulta y agregue ORDER BY, DESC y el nombre de la columna.

SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age DESC, name

Salida:

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|   8 | William |  26 |    1 |
|   7 |    Kris |  25 |    2 |
|   1 |  Samual |  25 |    3 |
|   6 |     Dew |  24 |    4 |
|   9 |  George |  23 |    5 |
|   4 |    Andy |  22 |    6 |
|   5 |   Brian |  21 |    7 |
|  12 |   Andre |  20 |    8 |
|   3 |    John |  20 |    9 |
|  11 |     Tom |  20 |   10 |
|   2 |    Vino |  20 |   11 |
|  10 |   Peter |  19 |   12 |

3. Implementar la función de clasificación paralela general de rango en MySQL

Ahora, si queremos asignar el mismo rango a las filas de datos paralelos, significa que esas filas con el mismo valor en la columna de comparación de rango deben mantener el mismo rango al calcular el rango en MySQL (por ejemplo, edad en nuestro ejemplo ). Para ello utilizamos una variable adicional.

SELECT pid, name, age, 
CASE 
WHEN @prevRank = age THEN @curRank 
WHEN @prevRank := age THEN @curRank := @curRank + 1
END AS rank
FROM players p, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY age

Salida:

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    3 |
|   4 |    Andy |  22 |    4 |
|   9 |  George |  23 |    5 |
|   6 |     Dew |  24 |    6 |
|   7 |    Kris |  25 |    7 |
|   1 |  Samual |  25 |    7 |
|   8 | William |  26 |    8 |

Como se muestra arriba, dos o más filas con los mismos datos y clasificación obtendrán la misma clasificación. Los jugadores Andre, Vino, John y Tom tienen la misma edad, por lo que están empatados en el segundo lugar. El siguiente jugador de mayor edad (Brian) ocupa el tercer lugar. Esta consulta es equivalente a la función DENSE_RANK () en MSSQL y ORACLE.

4. Implementar la función de clasificación paralela avanzada Rank en MySQL

Cuando se utiliza la función RANK (), si dos o más filas se clasifican una al lado de la otra, la misma fila tendrá la misma clasificación, pero hay una brecha relativa en la clasificación real.

SELECT pid, name, age, rank FROM
(SELECT pid, name, age,
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := age
FROM players p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r 
ORDER BY age) s

Esta es una subconsulta en una consulta. Cuando usamos tres variables (@incRank, @prevRank, @curRank) para calcular la relación, en el resultado de la consulta, hemos llenado la brecha de clasificación causada por el empate. Hemos cerrado la subconsulta a la consulta. Esta consulta es equivalente a la función RANK () en MSSQL y ORACLE.

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   10 |
|   8 | William |  26 |   12 |

Aquí podemos ver que Andre, Vino, John y Tom tienen todos la misma edad, por lo que están empatados en el segundo lugar. El siguiente jugador más viejo (Brian) ocupa el sexto lugar en lugar del tercero, porque 4 personas están empatadas en el segundo lugar.

Bien, espero que después de estos ejemplos, pueda comprender la diferencia entre RANK () y DENSE_RANK (), y saber dónde usar qué consulta para obtener la función de rango en MySQL. Gracias.

Reimpresión http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql

Supongo que te gusta

Origin blog.csdn.net/qq_45531729/article/details/112287722
Recomendado
Clasificación