2010-12-16 21 views
7

He una consulta ordenada por nombre que volver SMT como esto:Mysql Seleccione Siguiente y Anterior fila no ORDER BY ID

ID  NAME 
2121927 AAA 
2123589 AAB 
2121050 AAC 
2463926 BBB ---> known ID 
2120595 CCC 
2122831 DDD 
2493055 EEE 
2123583 EEF 

Necesito saber la siguiente ID y el ID anterior (si existe) de la conocida ID & & NOMBRE ¿Cómo es posible con solo 1 consulta?

+0

puede hacerlo en 2 consultas, consulte examp le how: http://stackoverflow.com/questions/1259458/sql-pulling-a-row-for-next-or-previous-row-of-a-current-row –

+0

@Haim, puede unir las dos consultas junto con una unión, ¿no? –

Respuesta

11
SELECT *, 
     'next' 
    FROM table 
    WHERE `name` > 'BBB' 
ORDER BY `name` 
    LIMIT 1 

UNION 

    SELECT *, 
     'previous' 
    FROM table 
    WHERE `name` < 'BBB' 
ORDER BY `name` DESC 
    LIMIT 1 

Si usted no sabe especial valor BBBname campo - que podría reemplazarlo con subconsulta como SELECT name FROM table WHERE id = 42, donde 42 es el ID valor conocido.

+0

lol, lo siento :) tuve el resultado correcto con la siguiente fila, la fila anterior fue la primera porque pedí por ASC no DESC. – Luca

+0

¿Qué sucede si ordena por columnas múltiples (y no únicas)? –

+0

@ Matěj Koubík: necesita agregar otra columna para coherencia, tecla principal por ejemplo – zerkms

-4

Lo hice así:
No es el más rápido, pero no le importa el orden de los campos.
Consulta todas las filas de db para que quieras.
Usa php foreach para encontrar la identificación actual.
Obtener el índice de matriz del ID actual, hacer el índice +1 o el índice -1.

$current_id = 6;
$data = get_all_data_from_db();
foreach($data as $index=>$row) {
if($current_id == $row['id']) {
$next = $index+1;
$prev = $index-1;
}
$previous_row = $data[$prev];
$next_row = $data[$next];

+0

en serio? ¿Un "foreach"? Cuando en la respuesta aceptada hay una buena solución limpia usando un 'UNION' de dos consultas simples. – Yaroslav

Cuestiones relacionadas