Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Nachfolgezeile aus Tabelle holen

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302

    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
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von Jor Beitrag anzeigen
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302
    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 ).
    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).
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

  4. #4
    Registrierter Benutzer
    Registriert seit
    20.08.2008
    Ort
    Hannover
    Beiträge
    7
    ich würde das wie folgt lösen:

    PHP-Code:
    $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); 

  5. #5
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302
    Hallo uzumakinaruto,

    vielen Dank für deine Hilfe, ich werde dein Lösungsvorschlag direkt mal übernehmen und mein Script anpassen.
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

  6. #6
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von Jor Beitrag anzeigen
    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
    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.

    Zitat Zitat von Jor Beitrag anzeigen
    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.

    Zitat Zitat von Jor Beitrag anzeigen
    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().

  7. #7
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von BLUESCREEN3D Beitrag anzeigen
    @uzumakinaruto: Informier dich mal bitte über SELECT COUNT(*) und mysql_free_result().
    Du denkst falsch 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.
    Geändert von msi (24-08-2008 um 21:55 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    20.08.2008
    Ort
    Hannover
    Beiträge
    7
    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

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von uzumakinaruto Beitrag anzeigen
    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
    nein ist es nicht, denn die db kann auf einmal intern eine andere reihenfolge benutzen (zB wenn die daten defragmentiert werden)

  10. #10
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302
    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
    Ich danke euch!
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •