New question

Question:

Date: 05-11-2020 13:16:58 (In Spanish)

Mostrar 3 registros anteriores de una consulta ordenada por un campo que no es un indice.[Unresolved]

Hola buenas, tengo una duda de como armar una consulta que muestre los tres registros anteriores a un usuario según su puntuación.

La tabla (resultados) contiene los siguientes campos:
id - id del número de registro
codigousuario - el id del usuario
nombre - el nombre del usuario
puntos - la puntuación del usuario

La consulta es la tabla ordenada por puntos descendente para hacer una especie de clasificación:

$consulta = mysqli_query($link,"SELECT * FROM resultados ORDER BY puntos DESC");

Entonces lo que me interesa ahora es mostrar los 3 usuarios que haya por encima (que sería los 3 registros anteriores de la misma consulta) del usuario que tiene codigousuario "x" y no se como armarlo.

Gracias de antemano.


Tags: Database - MySQL - PHP - PHP Advanced - Question Votes: 0 - Answers: 6 - Views: 4 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 06-11-2020 13:18:55 Bueno ya he dado con la tecla usando mysqli_data_seek().
    Primero lo que hago es buscar el registro que contiene el id del usuario en la lista ordenada por puntuación. y con mysqli_data_seek me muevo a la fila de ese registro y a los anteriores mostrando sus datos:

    1º Obtener la posición del registro en la tabla de ordenada por puntos:

    include ('cargabd.php');
    mysqli_set_charset($link,"utf8");
    $npos = 0;
    $consulta = mysqli_query($link,"SELECT * FROM resultados ORDER BY puntos DESC");
    while($row = mysqli_fetch_array($consulta))
    {
    $npos++;
    if ( $row['codigousuario'] == 46 )
    {
    break;
    }
    }

    2º Ir a la posición obtenida y visualizarlo con los 2 que hay encima restando posiciones y los dos por debajo.

    if ($result = $consulta)
    {
    /* saltar a la fila número $npos -3 (2x encima */
    mysqli_data_seek($result, $npos-3);
    /* obtener fila */
    $row = mysqli_fetch_row($result);
    echo "ID_usuario: ".$row['1']. " Puntos: ".$row['8']."</br>";


    mysqli_data_seek($result, $npos-2); // el anterior

    $row = mysqli_fetch_row($result);
    echo "ID_usuario: ".$row['1']. " Puntos: ".$row['8']."</br>";

    mysqli_data_seek($result, $npos-1); // el usuario
    $row = mysqli_fetch_row($result);
    echo "ID_usuario: ".$row['1']. " Puntos: ".$row['8']."</br>";

    mysqli_data_seek($result, $npos); // el siguiente
    $row = mysqli_fetch_row($result);
    echo "ID_usuario: ".$row['1']. " Puntos: ".$row['8']."</br>";

    mysqli_data_seek($result, $npos+1);
    $row = mysqli_fetch_row($result);
    echo "ID_usuario: ".$row['1']. " Puntos: ".$row['8']."</br>";

    /* liberar resultado */
    mysqli_free_result($result);
    }

    /* cerrar conexión */
    mysqli_close($link);


    P.D.: Ahora tengo otra pregunta. ¿Se puede obtener la posición del registro (el apartado 1º)de una forma más directa para no tener que mirar todos los registros, ya que imagino que si estuviera por ejemplo en la posición 100000 tardaría más la consulta en realizarse.
      Votes: 0 - Link answer
     
  • Date: 11-11-2020 12:25:54 Una consulta como:

    SELECT * FROM resultados WHERE puntos > 
    (SELECT puntos FROM resultados WHERE codigousuario = 46) 
    ORDER BY puntos ASC LIMIT 3


    ¿No te daría el resultado que buscas?
      Votes: 2 - Link answer
     
  • Date: 12-11-2020 11:30:20 Gracias si, pero al final lo que voy a usar es mysqli_data_seek porque he pensado en cambiar la clasificación. Mostraré los 10 primeros y ya luego la posición donde se encuentre el usuario mostraré la posición de los dos por encima del usuario y lo dos por debajo del usuario. Ya lo que me hace falta es como saber la posición en la tabla sin tener que ir leyendo todos los registros uno a uno.   Votes: 0 - Link answer
     
  • Date: 13-11-2020 08:00:53 Ok... tal vez te convenga entonces usar una consulta tipo UNION... digo, yo haría todo lo posible por evitar el mysqli_data_seek :)   Votes: 0 - Link answer
     
  • Date: 14-11-2020 05:16:58 Ok miraré a ver, pero porque no es recomendable usar mysqli_data_seek?   Votes: 0 - Link answer
     
  • Date: 16-11-2020 02:34:00 En general es preferible que sea el servidor de DB quien resuelva, de esa forma evitas sobrecargar la red y la memoria del webserver.

    Imagina por ejemplo si en lugar de hacer un where dentro del SQL devolvieras el conjunto completo de resultados y lo filtraras del lado de php... sería muy ineficiente.

    De hecho, si entendí bien tu caso, estás generando un conjunto de resultados bastante grande cuando la gran mayoría ni los vas a usar...
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In