Extraer registro anterior y siguiente.

Resumen.

En este artículo vamos a ver como extraer registros no por un valor concreto, sino por la posición que ocupa en la tabla respecto a un cierto registro, como por ejemplo, el primer registro, el ultimo, el registro anterior a uno concreto o el siguiente. Vamos a ello.

Artículo.

Para extraer registros que ocupan una posición concreta, como el primero o el último, el anterior o el siguiente, cualquiera pensaría en extraerlos a partir del “id” sumando o restando, recordemos la tabla de referencia.

Pero hacerlo así podría ser válido en algún caso, dejaría de ser válido si por ejemplo queremos saber quien fue la última mujer en registrarse en nuestra Web el pasado mes de diciembre, o cual es la fecha de la primera factura del mes de diciembre en Sevilla.

Este tipo de acción la podemos realizar a partir de un campo “id” como el de nuestra tabla de referencia, pero también lo podemos hacer a partir de un campo fecha, por supuesto, si este respeta los criterios de ordenación de MySQL.

La sintaxis que usaremos para extraer este tipo de datos será la siguiente:

<?php
// Extraer registros segun su posicion en tablas MySQL

include('archivos/func_conexionBD.php');

$Conex_BD = ConectaBD();

$_Posicion_Registro = "SELECT * FROM $tb1 ORDER BY id ASC LIMIT 1";
$_Extrae_Fila = mysqli_query($Conex_BD, $_Posicion_Registro);
$Mi_Registro = mysqli_fetch_row($_Extrae_Fila);

DesconectaBD($Conex_BD);

echo "<pre>";
print_r($Mi_Registro);
echo "</pre>";

$registro = $Mi_Registro[0];

echo "<p>$registro</p>";
?>


En la que solo tendremos que modificar la variable $_Posicion_Registro que es la que contiene la consulta. Dado que mysqli_fetch_row nos devuelve un array, lo imprimimos para conocer la key del dato que precisamos. Si nos interesa el “id”, dado que su key el 0, sacamos este valor en la variable $registro = $Mi_Registro[0] donde $Mi_Registro es la variable array que contiene todos los datos del registro.

La estructura de la consulta es simple

SELECT * FROM $tb1 ORDER BY id ASC LIMIT 1


Con el asterisco pedimos todos los campos de la tabla, si no los quisiéramos todos, pondríamos sus nombre separados por comas en lugar del asterisco (Ej: usuario, email), indicamos el nombre de la tabla, y aquí viene la clave, exigimos un orden en función del campo id, que como sabemos es numérico, autoincremental y único. Otro campo que podríamos usar seria “time” que nos recoge la fecha UNIX, por lo que es improbable (pero no imposible) que se repita. Por ultimo, mediante LIMIT hacemos que la consulta solo nos muestre un registro.

Dicho esto, las formas que puede tomar la consulta serian las siguientes:

Mostrar el primer registro:
SELECT * FROM $tb1 ORDER BY id ASC LIMIT 1


Mostrar el ultimo registro:
SELECT * FROM $tb1 ORDER BY id DESC LIMIT 1


Mostrar el primer registro de hombres:
SELECT * FROM $tb1 WHERE sexo = '1' ORDER BY id ASC LIMIT 1


Mostrar el primer registro de febrero de 2023:
SELECT * FROM $tb1 WHERE f_regis > '2023-01-31 23:59' ORDER BY id ASC LIMIT 1


Mostrar el penúltimo registro:
$ultimo_id = 73; // Ultimo id guardado
SELECT * FROM $tb1 WHERE id < '$ultimo_id' ORDER BY id DESC LIMIT 1


Ya se que estaréis pensando mas de uno, ¿para extraer el penúltimo bastaría con restar 1 al ultimo id? Y podría funcionar, pero solo si el registro anterior no hubiera sido eliminado o bien, no hubiera una condición, por ejemplo de haber realizado la validación. En estos casos, restar 1 podría no ser una opción valida.

SELECT * FROM $tb1 WHERE id < '$ultimo_id' AND validaok = 'si' ORDER BY id DESC LIMIT 1


Y esto es todo, esperamos os haya resultado interesante este artículo.
Tags: Anterior || siguiente || primero || último || LIMIT || ORDER

Comentarios.

Sin comentarios, publica el tuyo.