¿Cómo obtengo las filas anteriores y siguientes aunque se hayan eliminado algunas filas?

StackOverflow https://stackoverflow.com/questions/1229901

  •  22-07-2019
  •  | 
  •  

Pregunta

Tengo las siguientes funciones PHP que determinan las filas siguientes y anteriores en una base de datos. Sin embargo, hay muchas ocasiones en que las filas se pueden eliminar y, por lo tanto, mis funciones no funcionarán, ya que todo lo que hacen es disminuir el campo auto_increment.

Por ejemplo, la fila actual 5. Mi función da: 4 (anterior) y 6 (siguiente). ¿Qué pasa si se eliminan 6 y 7? Mi mejor idea es seguir haciendo consultas hasta que obtenga una fila, pero esto parece ineficiente, ¿hay una mejor manera?

Gracias a todos

//function to get next tweet
function getNextTweet($key, $direction){

$sql = "SELECT tweet_id FROM tweets WHERE tweet_key = '$key' LIMIT 1";

$result = mysql_query($sql) or die("DB Error : ". mysql_error());

$result = mysql_fetch_assoc($result);

if($direction=='next'){

    $tweet_id = $result['tweet_id'] + 1;

}else{

    $tweet_id = $result['tweet_id'] - 1;

}

$sql = "SELECT * FROM tweets WHERE tweet_id = '$tweet_id' LIMIT 1";

$result = mysql_query($sql) or die("DB Error : ". mysql_error());   

return mysql_fetch_assoc($result);

}
¿Fue útil?

Solución

Suponiendo que no tienes un billón de registros ...

Anterior:

SELECT * 
FROM table 
WHERE (id < currentID) 
ORDER BY id DESC 
LIMIT 1

Siguiente

SELECT * 
FROM table 
WHERE (id > currentID) 
ORDER BY id ASC 
LIMIT 1

Otros consejos

Si ejecuta una versión moderna de MySQL, puede simplificar su función en

function getNextTweet($key, $direction)
{
    $cmp   = ($direction == 'next') ? '>' : '<';
    $order = ($direction == 'next') ? 'ASC' : 'DESC';

    $sql = "SELECT *
              FROM tweets
             WHERE tweet_id $cmp (SELECT tweet_id FROM tweets WHERE tweet_key = '$key' LIMIT 1)
          ORDER BY tweet_id $order
             LIMIT 1";

    $result = mysql_query($sql) or die("DB Error : ". mysql_error());       

    return mysql_fetch_assoc($result);
}

Siempre y cuando "tweet_id" está indexado, la consulta será muy rápida, incluso para millones de registros.

¡Una última cosa, asegúrese de que $ key esté correctamente validado! De lo contrario, cualquiera puede inyectar SQL en su consulta, eso es una gran falla de seguridad. Si $ key es cualquier cosa menos una clave hash, debería al menos pasar por mysql_real_escape_string()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top