一部の行が削除されていても、前の行と次の行を取得するにはどうすればよいですか?
質問
データベース内の次の行と前の行を決定する次の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);
}
解決
バジリオンレコードがないと仮定します...
前:
SELECT *
FROM table
WHERE (id < currentID)
ORDER BY id DESC
LIMIT 1
次へ
SELECT *
FROM table
WHERE (id > currentID)
ORDER BY id ASC
LIMIT 1
他のヒント
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);
}
&quot; tweet_id&quot;の場合インデックスが付けられている場合、クエリは非常に高速になり、数百万のレコードに対しても実行されます。
最後に、 $ keyが適切に検証されていることを確認してください!それ以外の場合は、誰でもクエリにSQLを挿入できます。これは大きなセキュリティ上の欠陥です。 $ key
がハッシュキー以外の場合、少なくとも mysql_real_escape_string()
所属していません StackOverflow