即使已删除某些行,如何获取上一行和下一行?

时间:2009-08-04 20:56:44

标签: php mysql recordset

我有以下PHP函数来确定数据库中的下一行和上一行。但是,有很多情况下可以删除行,因此我的函数不能正常工作,因为它们只会减少auto_increment字段。

例如,当前行5.我的函数给出:4(上一个)和6(下一个)。如果删除6和7怎么办?我最好的想法是继续查询直到我排好,但这似乎效率低下,有更好的方法吗?

全部谢谢

//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);

}

2 个答案:

答案 0 :(得分:8)

假设你没有bajillion记录......

一个:

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

下一步

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

答案 1 :(得分:0)

如果运行现代版本的MySQL,可以将功能简化为

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);
}

只要索引“tweet_id”,查询就会非常快,即使对于数百万条记录也是如此。

最后一点,确保$ key已正确验证!否则,任何人都可以在查询中注入SQL,这是一个巨大的安全漏洞。如果$key不是哈希键,则至少应该通过mysql_real_escape_string()