Dices
Cita:
Tengo 1 tabla con varias rows, que representan textos escritos por distintos usuarios.
Las columnas son básicamente: id | usuario | texto
Lo que quiero lograr es, al seleccionar determinada ID dentro de la tabla, saber cúal es el ID de la row anterior (del mismo usuario) y cual es el ID de la row siguiente (del mismo usuario).
Para eso tienes que decirnos antes qué criterio vas a seguir para seleccionar la primera ID de ese autor; por ejemplo si vas a buscar un texto concreto de ese autor, si sólo vas a buscar una de ese autor al azar, o vas a seleccionar todo al azar. Hacer esto con PHP, por ejemplo, es fácil, pues cuando cargas, aunque sea al azar, encuentras un id, un autor o un texto, ya tienes un punto de referencia para buscar los dos anteriores. Aquí sacas al azar un dato.
SELECT * FROM tabla order by rand() limit 1,
De esa consulta cargas en PHP mediante las funciones pertinentes el $id=$row['id'], $autor=$row['autor'] y $texto=$row['texto']
Ahora es fácil con dos union all traérte lo que quieres en una sola consulta (en realidad es la segunda consulta):
(SELECT * FROM tabla WHERE id > $id AND autor LIKE '$autor' ORDER BY id DESC LIMIT 1)
UNION ALL
(SELECT * FROM tabla WHERE id = $id)
UNION ALL
(SELECT * FROM tabla WHERE id < $id AND autor LIKE= '$autor') ORDER BY id DESC LIMIT 1)
Con PHP podrías también traértelo en tres consultas..., pero eso podrás pedirlo en el foro PHP.
Otra cosa es hacerlo con una única consulta y con MySQl, pero para eso deberías tener ya el dato, por ejemplo haber cargado en un formulario de búsqueda dentro de input text los datos que quieras o escribirlos directamente en la consulta MySQL. Aquí un ejemplo con nombre de autor y parte de texto...
(SELECT * FROM tabla WHERE id > (SELECT id FROM tabla WHERE autor = 'nombreautor%' AND texto = '%partetexto%') ORDER BY id DESC LIMIT 1)
UNION ALL
(SELECT * FROM tabla WHERE autor = 'nombreautor%' AND texto = '%partetexto%')
UNION ALL
(SELECT * FROM tabla WHERE id < (SELECT id FROM tabla WHERE autor= 'nombreautor%' AND texto = '%partetexto%') ORDER BY id DESC LIMIT 1)
Como ves la solución es con UNION ALL, aunque en PHP, como te he dicho, podrían hacerse tres consultas sin necesidad de usar UNION ALL; a una de ellas le llamarías anterior y a otra posterior..., aunque los criterios de búsqueda serían parecidos a los de la primera consulta que te puse...
Esto de la única consulta MysQL no se me ha ocurrido a mí, sino que es obra de Jose_minglein2 y me lo encontré en el siguiente post del foro donde se trata el tema y podrás encontrar más soluciones:
Revisa este POST
http://www.forosdelweb.com/f86/obten...ores-x-336794/
Mira esta otra de Jose_minglein2:
select * from tabla T where (id > (select id from tabla where autor='nombre') and id < (select id + 1 from tabla where autor='nombre')) or (id < (select id from tabla where autor='nombre') and id > (select id - 1 from tabla where autor='nombre'))
Pero, claro, primero tendrías que añadir otro criterio además del de autor, pues si no hay otro criterio, aunque sea el orden por el criterio que sea (alfabético descendente, ascendente, etc.), te sacará el primero que introdujiste en la base, y si no limitas, te sacará todos los de ese autor...
Espero haberlo aplicado bien. No lo he probado. Comprueba los resultados y ya nos dirás.