2010-09-13 39 views
5

Asumiendo esta tabla se ordena por fechaSeleccione registros adyacentes en MySQL

id  | date  | customer 
3  | 2009-10-01| Frank 
1  | 2010-10-11| Bob 
4  | 2010-11-01| Mitchel 
2  | 2010-11-02| Jim 

me gustaría hacer una consulta, por lo que el conocimiento de ID = 4 las filas resultantes son

$row[0]['id'] == 1 //previous 
$row[1]['id'] == 4 //most recent/current 
$row[2]['id'] == 2 //next 

Un MySQL solamente La solución sería lo mejor, pero si hay una solución php elegante también sería genial.

+0

es la tabla ordenado por 'date' columna? Parece que sí. Por favor aclara – shamittomar

+0

'Suponiendo que esta tabla está ordenada por fecha' sí, por fecha, pero si fue ordenada por alfabeto supongo que la solución sería similar – Moak

Respuesta

4

Como la tabla está ordenada por date la columna, puede ejecutar consultas siguientes conseguirlo:

  • Para fila anterior:

    select * from tablename where `date` < (select `date` from tablename where id=4) order by `date` desc limit 1 
    
  • Para fila actual:

    select * from tablename where id=4 
    
  • Para la siguiente fila:

    select * from tablename where `date` > (select `date` from tablename where id=4) order by `date` asc limit 1 
    

Salida: Estos tres consultas devuelven el resultado (uno por uno) de la siguiente manera:

id date  customer 
1 2010-10-11 Bob 
4 2010-11-01 Mitchel 
2 2010-11-02 Jim 
+0

Esto definitivamente funciona, y es probablemente el camino a seguir para solo tres entradas; si crees que podrías expandirte a, p. 5 registros antes y después del resultado, entonces esto ya no funcionaría, y querría algo más generalizable. – bnaul

0

la función de límite puede tomar dos argumentos, un desplazamiento y un número de filas para regresar. En su caso, desea que el desplazamiento sea (el número de filas con fechas anteriores a la fila deseada) - 1, o en este caso 2 - 1 = 1, y el número de filas sea tres. Por lo que el SQL que desea es

SELECT * FROM customers ORDER BY date ASC LIMIT 1,3; 

y el número "1" será el resultado de la consulta

SELECT COUNT(*)-1 FROM customers WHERE date > "2010-11-01"; 

no creo MySQL le permitirá utilizar un valor subselección o función que el argumento de LIMIT, por lo que tendrás que almacenar eso usando PHP y construir la siguiente consulta de esa manera.

1

Dado que usted está ordenando por fecha, pero basando la fila que desea las filas adyacentes en la identificación, va a tener que hacer 2 consultas. El primero para determinar la fecha de la identificación que ha seleccionado, el segundo para obtener las filas adyacentes.

Paso 1 - Obtener la fecha

Select date 
FROM yourtable 
WHERE id = 4 

Paso 2 - Obtener todas las filas

SELECT * 
FROM yourtable 
WHERE date IN ( (select MAX(date) from yourtable where date < $datefromquery1) 
       , $datefromquery1 
       , (select MIN(date) from yourtable where date > $datefromquery1) 
       ) 
Cuestiones relacionadas