Digamos que tengo registros con ID 3,4,7,9 y quiero poder ir de uno a otro navegando a través de los enlaces siguiente / anterior. El problema es que no sé cómo obtener el registro con la ID más alta más cercana.
Entonces, cuando tengo un registro con ID 4, necesito poder recuperar el siguiente registro existente, que sería 7. La consulta probablemente se vería algo así como
SELECT * FROM foo WHERE id = 4 OFFSET 1
¿Cómo puedo obtener el registro siguiente / anterior sin obtener todo el conjunto de resultados e iterar manualmente?
Estoy usando MySQL 5.
Respuestas:
siguiente:
anterior:
fuente
Además de cemkalyoncu's solución :
siguiente registro:
récord anterior:
editar: dado que esta respuesta ha recibido algunos votos positivos últimamente, realmente quiero enfatizar el comentario que hice antes sobre entender que una columna de clave principal no está pensada como una columna para clasificar, porque MySQL no garantiza que aumente automáticamente , los valores se agregan necesariamente en un momento posterior.
Si no le importa esto, y simplemente necesita el registro con un valor más alto (o más bajo)
id
, esto será suficiente. Simplemente no use esto como un medio para determinar si un registro se agrega realmente más tarde (o antes). En su lugar, considere usar una columna de fecha y hora para ordenar, por ejemplo.fuente
Todas las soluciones anteriores requieren dos llamadas a la base de datos. El siguiente código sql combina dos declaraciones sql en una.
fuente
DISTINCT
antes*
lo hará aún mejor, es decir, por supuesto, siid
puede tener0
como valor.id
lugar de dos.fuente
SELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1
para el registro previouseIntentaba hacer algo similar a esto, pero necesitaba los resultados ordenados por fecha, ya que no puedo confiar en el campo ID como una columna ordenable. Aquí está la solución que se me ocurrió.
Primero descubrimos el índice del registro deseado en la tabla, cuando está ordenado como queremos:
Luego decremente el resultado en 2 y colóquelo en la declaración de límite. Por ejemplo, lo anterior me devolvió 21, así que ejecuto:
Le da su registro primario junto con sus registros siguientes y anteriores dado su pedido declarado.
Traté de hacerlo como una sola llamada a la base de datos, pero no pude obtener la declaración LIMIT para tomar una variable como uno de sus parámetros.
fuente
Prueba este ejemplo.
Nota: Si no se encuentra el valor , devolverá nulo .
En el ejemplo anterior, el valor anterior será Raja y el valor siguiente será nulo porque no hay un valor siguiente.
fuente
Usando el enfoque de @Dan, puede crear uniones. Simplemente use una variable @ diferente para cada subconsulta.
fuente
current
->current_row
&previous
->previous_row
.Fila siguiente
Fila anterior
muestra siguiente fila
muestra fila anterior
fuente
Tenía el mismo problema que Dan, así que usé su respuesta y la mejoré.
Primero seleccione el índice de fila, nada diferente aquí.
Ahora use dos consultas separadas. Por ejemplo, si el índice de la fila es 21, la consulta para seleccionar el siguiente registro será:
Para seleccionar el registro anterior, use esta consulta:
Tenga en cuenta que para la primera fila (el índice de fila es 1), el límite irá a -1 y obtendrá un error de MySQL. Puede usar una declaración if para evitar esto. Simplemente no seleccione nada, ya que no hay registro anterior de todos modos. En el caso del último registro, habrá la siguiente fila y por lo tanto no habrá resultado.
También tenga en cuenta que si usa DESC para ordenar, en lugar de ASC, sus consultas para seleccionar las filas siguiente y anterior siguen siendo las mismas, pero cambiadas.
fuente
Esta es una solución universal para condiciones con más resultados iguales.
fuente
Aquí tenemos una forma de obtener registros anteriores y siguientes utilizando una sola consulta MySQL. Donde 5 es la identificación del registro actual.
fuente
¿Cómo obtener el registro siguiente / anterior en MySQL y PHP?
Mi ejemplo es obtener solo la identificación
fuente
Optimizando el enfoque @Don para usar solo una consulta
cambiar CurrentArticleID con ID de artículo actual como
fuente
Hay otro truco que puede usar para mostrar columnas de filas anteriores, usando cualquier orden que desee, usando una variable similar al truco @row:
Aparentemente, las columnas seleccionadas se evalúan en orden, por lo que esto primero seleccionará las variables guardadas y luego actualizará las variables a la nueva fila (seleccionándolas en el proceso).
NB: No estoy seguro de que este sea un comportamiento definido, pero lo he usado y funciona.
fuente
Si desea alimentar más de uno
id
a su consulta y obtenernext_id
todos ellos ...Asigne
cur_id
su campo de selección y luego aliméntelo a la subconsulta para ingresar alnext_id
campo de selección. Y luego seleccione solonext_id
.Usando la respuesta de cuello largo para calc
next_id
:fuente
fuente
Si tiene una columna de índice, diga id, puede devolver la identificación anterior y la siguiente en una solicitud sql. Reemplazar: id con su valor
fuente
Mi solución para obtener el siguiente registro y las vistas previas también para volver al primer registro si estoy en el último y viceversa
No estoy usando la identificación, estoy usando el título para buenas URL
Estoy usando Codeigniter HMVC
fuente
Aquí está mi respuesta. Tomo una idea de ' Decent Dabbler ' y agrego la parte que verifica si la identificación está entre min (id) y max (id). Aquí está la parte para crear mi tabla.
);
El siguiente paso es crear un procedimiento almacenado que sea responsable de obtener la identificación anterior.
El primer método es bueno si los índices están ordenados, pero si no lo están. Por ejemplo, si tiene índices: 1,2,7 y necesita obtener el índice número 2 de esta manera mucho mejor para usar otro enfoque.
fuente
100% trabajando
fuente
Creo que para tener la fila real siguiente o anterior en la tabla SQL, necesitamos que el valor real con igual, (<o>) devuelva más de uno si necesita cambiar la posición de la fila en una tabla de pedidos.
necesitamos el valor
$position
para buscar laneighbours
fila En mi tabla creé una columna 'posición'y la consulta SQL para obtener la fila necesaria es:
para el siguiente:
para el anterior:
fuente
Seleccione top 1 * de foo donde id> 4 ordenar por id asc
fuente
select * from foo where id>4 order by id asc LIMIT 1