我有以下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);
}
答案 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()