一部の行が削除されていても、前の行と次の行を取得するにはどうすればよいですか?

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

  •  22-07-2019
  •  | 
  •  

質問

データベース内の次の行と前の行を決定する次の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()

を通過する必要があります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top