MySQL - Guardar posicion de ranking en fila de tabla mysql

 
Vista:

Guardar posicion de ranking en fila de tabla mysql

Publicado por Josetxu (2 intervenciones) el 31/08/2017 16:18:05
Hola a tod@s:

Tengo una tabla con varios usuarios con partidos jugados, partidos ganados, puntos, etc...

Hago un select para mostrar el Ranking, es decir, la posición de cada usuario. Hasta aquí todo ok

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
include("conexion.php");
 
$sql = "SELECT *, ((part_gan/part_jug)*100) AS media FROM colegas ORDER BY media DESC, part_gan DESC";
$result = mysqli_query($conn, $sql);
$numero = 0;
 
echo "<br>";
echo "<table class='ranking'>";
  echo "<tr>";
		 echo "<td><b> PUESTO </td>";
                 echo "<td><b> NOMBRE </td>";
                 echo "<td><b> PARTIDOS JUGADOS </td>";
		 echo "<td><b> PARTIDOS GANADOS </td>";
		 echo "<td><b> PUNTOS </td>";
		 echo "<td><b> MEDIA </td>";
   echo "</tr>";
echo "</table>";
echo "<br>";
 
while($rows=mysqli_fetch_array($result)){
 
$puntos = $rows[5]*2;
$media = round(($rows[5]/$rows[4])*100);
$numero++;
 
echo "<table class='ranking'>";
  echo "<tr>";
		 echo "<td> $numero </td>";
                 echo "<td> $rows[0] </td>";
                 echo "<td> $rows[4] </td>";
		 echo "<td> $rows[5] </td>";
		 echo "<td> $puntos </td>";
		 echo "<td> $media %</td>";
       echo "</tr>";
echo "</table>";
}
?>


Mi pregunta es:
Como puedo guardar esa posición ($numero) en una fila llamada posicion (por ejemplo) en mi base de datos.

Gracias por anticipado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Guardar posicion de ranking en fila de tabla mysql

Publicado por leonardo_josue (414 intervenciones) el 31/08/2017 18:24:07
Hola Josetxu:

Aquí habría que hacerte primero una observación... un campo CALCULADO NO DEBE ALMACENARSE EN BASE DE DATOS... entonces no veo mucho la utilidad de hacer lo que quieres.

de acuerdo a lo que veo en tu programa, lo único que haces es numerar tus registros con una secuencia de 1 en 1... por lo tanto, ni siquiera habría necesidad de utilizar esa variable "NUMERO", sino que lo podrías hacer con una consulta. Hay muchas formas de hacer esto que quieres, aquí te muestro algunas. Supongamos que tienes una tabla así:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla;
+--------+--------+
| nombre | puntos |
+--------+--------+
| HUGO   |     10 |
| PACO   |      8 |
| LUIS   |     15 |
| LEO    |      7 |
| OTRO   |      9 |
+--------+--------+
5 rows in set (0.00 sec)

Imagina que quieres ordenar los registros por puntos y asignarles una POSICIÓN, entonces, ordenados serían así:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla ORDER BY puntos DESC;
+--------+--------+
| nombre | puntos |
+--------+--------+
| LUIS   |     15 |
| HUGO   |     10 |
| OTRO   |      9 |
| PACO   |      8 |
| LEO    |      7 |
+--------+--------+
5 rows in set (0.00 sec)

Ahora, pasa asignar la posición, una forma sería con una SUBCONSULTA, para contar cuántos registros hay con un puntaje mayor al que haces referencia, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT
    ->   T1.nombre,
    ->   T1.puntos,
    ->   ( SELECT COUNT(1)
    ->     FROM tabla T2
    ->     WHERE T2.puntos >= T1.puntos) rank
    -> FROM tabla T1
    -> ORDER BY puntos DESC;
+--------+--------+------+
| nombre | puntos | rank |
+--------+--------+------+
| LUIS   |     15 |    1 |
| HUGO   |     10 |    2 |
| OTRO   |      9 |    3 |
| PACO   |      8 |    4 |
| LEO    |      7 |    5 |
+--------+--------+------+
5 rows in set (0.00 sec)

Otra forma sería utilizando una variable tipo contador, es decir, lo mismo que haces con tu variable NUMERO, pero directamente en el SELECT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SET @rank=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT
    ->   nombre,
    ->   puntos,
    ->   @rank:=@rank+1 AS rank
    -> FROM tabla
    -> ORDER BY puntos DESC;
+--------+--------+------+
| nombre | puntos | rank |
+--------+--------+------+
| LUIS   |     15 |    1 |
| HUGO   |     10 |    2 |
| OTRO   |      9 |    3 |
| PACO   |      8 |    4 |
| LEO    |      7 |    5 |
+--------+--------+------+
5 rows in set (0.00 sec)

y así mucha otras formas... entonces vuelvo al punto inicial, ¿Para qué necesitas guardar este dato en la la Base de Datos?.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Guardar posicion de ranking en fila de tabla mysql

Publicado por Josetxu (2 intervenciones) el 01/09/2017 09:02:34
Lo primero agradecerte tu aportación y tu respuesta.

La necesidad de guardar el dato de la posición en el ranking es porque quiero mostrar los datos de cada jugador individualmente en otra página de mi web y ahí poner: El nombre, los partidos ganados, los puntos y LA POSICIÓN que ocupa en el Ranking en ese momento. Por eso quiero guardar esa posición en la Base de Datos, para poder mostrarla en otra página PHP.

Gracias, un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar