Archiv verlassen und diese Seite im Standarddesign anzeigen : Nachfolgezeile aus Tabelle holen
Hallo zusammen,
auch nach intensiver Suche nach Lösung habe ich für folgendes Problem keine wirkliche Hilfe gefunden...
Eine auf einem MySQL-Server residierende Tabelle ohne fortlaufenden Zähler (Primary-Key) enthält x Rows, nun möchte ich über ein Statment die erste, die letzte und eine Folgezeile auf eine aus der Datenmitte geholte Zeile erfragen. Der dahintersteckende Sinn ist, auf einen gefundenen Eintrag den Nachfolger zu ermitteln und dort einen Wert zu setzten, würde die geholte Zeile die Letzte in der Tabelle sein, so müsste die Erste geholt werden.
Freu mich über jede Hilfe... danke :)
Hallo zusammen,
auch nach intensiver Suche nach Lösung habe ich für folgendes Problem keine wirkliche Hilfe gefunden...
Eine auf einem MySQL-Server residierende Tabelle ohne fortlaufenden Zähler (Primary-Key) enthält x Rows, nun möchte ich über ein Statment die erste, die letzte und eine Folgezeile auf eine aus der Datenmitte geholte Zeile erfragen. Der dahintersteckende Sinn ist, auf einen gefundenen Eintrag den Nachfolger zu ermitteln und dort einen Wert zu setzten, würde die geholte Zeile die Letzte in der Tabelle sein, so müsste die Erste geholt werden.
Freu mich über jede Hilfe... danke :)
wie bestimmst du die reihenfolge in der tabelle?
du brauchst irgendeine spalte die die reihenfolge angibt, die kannst du dann benutzen.
wenn du sowas nicht hast, wirds nicht gehen ;)
Hi msi,
yep, die Zielzeile wird über ein Select geholt bzw. angesprochen. Das wäre dann die Zeile von der alles ausgeht.
Somit muss irgend ein interner Zeiger oder ähnliches in der Tabelle gesetzt worden sein, der eventuell genutzt werden könnte (aber wie :confused: ).
Die Einträge sollen ohne Key in der Tabelle stehen, das Iterieren über die Rows soll, so wie ich es mir vorstelle, mittels SQL gehändelt werden. Ginge dieses nicht müsste ich die Tabelle erweitern und dann über eine ID die Verarbeitung regeln (möchte ich aber gerne drauf verzichten).
uzumakinaruto
23-08-2008, 18:52
ich würde das wie folgt lösen:
$sql = "SELECT feld1 FROM tbl";
$result = mysql_query($sql);
$anzahl_datensaetze = mysql_num_rows($result);
unset($sql, $result);
$first = "1";
$last = $anzahl_datensaetze-1;
$middle = $anzahl_datensaetze/2;
# debugging start
echo "Anzahl: ".$anzahl_datensaetze."<br>";
echo "erster: ".$first."<br>";
echo "letzter: ".$last."<br>";
echo "mitte: ".(int)$middle."<br>";
# debuggin ende
function sql_query($datensatz) {
$sql = "SELECT * FROM tbl Limit ".(int)$datensatz.", 1;";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
unset($sql, $result);
return $row['feld1']."<br>";
}
$erster = sql_query($first);
$letzter = sql_query($last);
$mitte = sql_query($middle);
Hallo uzumakinaruto,
vielen Dank für deine Hilfe, ich werde dein Lösungsvorschlag direkt mal übernehmen und mein Script anpassen. :) :D
BLUESCREEN3D
24-08-2008, 14:51
Eine auf einem MySQL-Server residierende Tabelle ohne fortlaufenden Zähler (Primary-Key) enthält x Rows, nun möchte ich über ein Statment die erste (...) Zeile erfragen.
Du denkst falsch :D
Einer der Gründe, weshalb du ein DBMS nutzts, ist doch, dass du dich damit nicht selbst darum kümmern musst, wo und wie die Daten gespeichert werden. Und zu dem "wie" gehört auch "in welcher Reihenfolge".
In SQL ist eine bestimmte Reihenfolge der Daten nur mit ORDER BY garantiert.
Deshalb ist der Code von uzumakinaruto auch keine Lösung. Er macht die Annahme, dass die Daten ohne ORDER BY eine feste Reihenfolge haben.
Der dahintersteckende Sinn ist, auf einen gefundenen Eintrag den Nachfolger zu ermitteln und dort einen Wert zu setzten, würde die geholte Zeile die Letzte in der Tabelle sein, so müsste die Erste geholt werden.
Anscheinend speicherst du in der Tabelle eine ringförmige Datenstruktur. Du könntest also 2 neue Spalten einführen: id und next.
id ist der Primärschlüssel und next enthält die id des Nachfolgers.
Da du die Vorgängerzeile ja anscheinend eh auslesen musst, hast du auch gleich die ID des Nachfolgers.
Ansonsten könntest du auch noch (oder stattdessen) den Vorgänger jedes Eintrages speichern.
Auf jeden Fall müsstest du bei so einer Datenstruktur darauf achten, dass die next-Zeiger konsistent bleiben, z.B. wenn einer der Einträge gelöscht wird.
fortlaufenden Zähler (Primary-Key)
Fortlaufende Zähler und Primärschlüssel haben nichts miteinander zu tun, sondern werden nur oft zusammen angewendet.
@uzumakinaruto: Informier dich mal bitte über SELECT COUNT(*) und mysql_free_result().
@uzumakinaruto: Informier dich mal bitte über SELECT COUNT(*) und mysql_free_result().
Du denkst falsch :D mysql_free_result ist in den meisten php skripten überflüssig, da diese sich eh sehr schenll wieder beenden.
wenn du trotzdem mysql_free_result benutzt machst du das progtramm
dadurch nur langsamer, da der speicher einmal intern im programm freigegebn
wird und nach dessen beendigung sowieso nochmal zum kernel.
mysql_free_result solltest du nur in programmen benutzen die länger laufen,
da diese sonst immer mehr speicher konsumieren und nicht wiederverwenden können.
ansonsten würde ich dem thread ersteller empfehlen einen einfachen primär key mit einem auto_increment zähler einzubauen
dadurch hat er eine einfache struktur in der tabelle mit der er bestimmen kann welche zeile vor/nach welcher steht.
eine next spalte ist hier meiner meinung nach nicht geeignet, da man sich dann noch um konsiszent kümmern muss (falls zeilen gelöscht werden).
praktisch ist eine next spalte nur wenn sich die reihenfolge in der tabelle ändern lassen soll, was aber hier offensichtlich nicht der fall ist.
uzumakinaruto
24-08-2008, 22:55
für sein aktuelles problem ist das eine lösung .. die select waren frei erfunden und müssen natürlich angepasst werden ;-)
primary key und auto_increment würden das ganze natürlich um einiges leichter machen.
sicher ist select count(*) ... die schnellere variante .. aber wer so eine datenbankstruktur verwendet, wird niemals allzuviele datensätze haben ;-)
du meinst wohl eher ein RDBMS :D
für sein aktuelles problem ist das eine lösung .. die select waren frei erfunden und müssen natürlich angepasst werden ;-)
primary key und auto_increment würden das ganze natürlich um einiges leichter machen.
sicher ist select count(*) ... die schnellere variante .. aber wer so eine datenbankstruktur verwendet, wird niemals allzuviele datensätze haben ;-)
du meinst wohl eher ein RDBMS :D
nein ist es nicht, denn die db kann auf einmal intern eine andere reihenfolge benutzen (zB wenn die daten defragmentiert werden)
Hallo zusammen,
die Diskussion ist mega interessant für mich, die Lösungsansätze könnten alle für meine Page genommen werden. Ja, es werden nicht viele Datensätze in der Tabelle sein, < 200 denke ich auf jeden Fall.
Den ersten Lösungsansatz von uzumakinaruto habe ich umgesetzt, aber, wie msi schon geschrieben hat, die Datensätz sind nach jeder Abfrage in einer anderen Reihenfolge... da habe ich mir gedacht, nehme ich ein 'order by' immer auf die erste Spalte und gut ist. Nee, entweder habe ich was falsch gemacht (ich bin nicht unfehlbar, aber in diesem Fall... ich glaube nicht), ist es immer so, dass die Anordnung (Reihenfolge) stets anders ist, bzw. immer nach ein paar Abfragen es so aus war, das der 'Zeiger' mittels 'Limit x , 1' immer vier Rows nach vorne sprang und nicht nur eine.
Das mit der ID wollte ich eigentlcih nicht, da ich gedacht habe, mach es mal etwas anders... aber, ich denke ich werde die Tabelle erweitern. Ich habe etwas gelernt, und das ist die Hauptsache... Wie in meinem unten aufgeführten Spruch geschrieben, habe ich es wohl nicht wirklich direkt einfacher machen wollen :rolleyes: ;)
Ich danke euch! :)
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.