2009-08-04 4 views
2

Ich habe die folgenden PHP-Funktionen, die die nächsten und vorherigen Zeilen in einer Datenbank bestimmen. Es gibt jedoch viele Gelegenheiten, bei denen Zeilen gelöscht werden können und daher funktionieren meine Funktionen nicht, da sie nur das Feld auto_increment dekrementieren.Wie bekomme ich vorherige und nächste Zeilen, obwohl einige Zeilen gelöscht wurden?

Zum Beispiel, aktuelle Reihe 5. Meine Funktion gibt: 4 (vorherige) und 6 (nächste). Was ist, wenn 6 und 7 gelöscht wird? Meine beste Idee ist es, weiter zu fragen, bis ich eine Zeile bekomme, aber das scheint ineffizient, gibt es einen besseren Weg?

Dank all

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

} 

Antwort

8

Sie keinen bajillion Aufzeichnungen ...

Vorherige haben Angenommen:

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

Weiter

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

Lebensretter! Arbeitete perfekt, danke. :) – Abs

+0

Was ist, wenn ich viele Datensätze bekomme? Gibt es eine Möglichkeit, die Anzahl der Zeilen zu limitieren, die die obigen Abfragen aufrufen? Ich meine nicht das LIMIT. Ich meine, wenn die MySQL DB tatsächlich nach den Datensätzen sucht? Danke für weitere Hilfe. – Abs

+0

Die ID wird als Primärschlüssel indiziert, und Sie haben ein Limit von 1, also wird es immer schnell sein, sogar mit einem "Bajillion" -Datensatz. –

0

Wenn Sie führen ein moderne Version von MySQL, können Sie si mplify Ihre Funktion in

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

Solange „tweet_id“ indiziert ist, wird die Abfrage sehr schnell sein, auch für Millionen von Datensätzen.

Eine letzte Sache, stellen Sie sicher, dass $ Schlüssel ordnungsgemäß validiert ist! Sonst kann jeder SQL in Ihre Anfrage einfügen, das ist ein riesiger Sicherheitsfehler. Wenn $key alles andere als ein Hash-Schlüssel ist, sollte es mindestens durchgehen mysql_real_escape_string()

Verwandte Themen