كيف يمكنني الحصول على الصفوف السابقة والقادمة حتى ولو تم حذف بعض الصفوف؟
سؤال
ولدي وظائف 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);
}
المحلول
وعلى افتراض انك لا تملك سجلات 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
نصائح أخرى
إذا قمت بتشغيل النسخة الحديثة من الخلية، يمكنك تبسيط وظيفة الخاص بك
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"، والاستعلام تكون سريعة جدا، حتى بالنسبة للملايين من السجلات.
وآخر شيء واحد، على تأكد من أن مفتاح $ يتم التحقق بشكل صحيح! وإلا، يمكن لأي شخص حقن SQL في الاستعلام الخاص بك، وهذا هو ثغرة أمنية ضخمة. إذا $key
أي شيء ولكن مفتاح تجزئة، وينبغي أن <م> على الأقل م> تمر mysql_real_escape_string()