Zugriff von Aktuellen Datensatz auf nächsten Datensatz?

chris4712

Erfahrenes Mitglied
Abend!

Ich lese mit folgendem Code Einträge aus einer Datenbank:
PHP:
$MySQLQuery = "SELECT
   MenuPos,
   Name,
   ID
FROM $UserDB_Content WHERE MenuItem != 'Page' AND MenuPos != '-1' ORDER BY MenuPos ASC";
$result = mysql_query($MySQLQuery);
 
 
 
while($PageDats = mysql_fetch_array($result))
{
   // Hier müsste ich nun auf den nächsten Datensatz zugreifen
}

Während des Auslesevorgangs müsste ich dann auf den nächsten Datensatz zugreifen.

Wie mache ich dies Hab leider noch nichts gefunden (Zugriff über PK geht leider nicht).

Gruß

Christian
 
Zuletzt bearbeitet:
Evtl. wäre das mit einem umständlichen Subquery möglich.
Du kannst aber auch in PHP die Daten zunächst in ein Array auslesen, und dann das Array erneut durchlaufen:
PHP:
$data=array();
while($PageDats = mysql_fetch_array($result)) {
   $data[] = $PageDats;
}
for ($i=0;$i<count($data);$i++) {
    $field1InNextRow = 
        (isset($data[$i+1]['field1']))?$data[$i+1]['field1']:null;
    $thisRow=$data[$i];
    //do something
}
Gruß hpvw
 
Hallo!

Danke erstmal für die schnelle Antwort.
Werde das mit dem Subquery mal versuchen.

An ein Array hatte ich auch schon gedacht. Aber da ich die ausgelesenen Werte eh in ein Array speichern möchte, müsse ich zwei Arrays erstellen.
Darauf wollte ich eigentlich verzichten :)

Gruß und noch mal Danke!

Christian
 
Mit Subquerys habe ich mich irgendwo im Dschungel verlaufen.
Ich habe jedoch mit einem LEFT JOIN und dem CONCAT-SUBSTR-Konstrukt, welches bei den "Funktionen zur Benutzung bei GROUP BY-Klauseln" dargestellt ist, ein Feld aus der nächsten Zeile in die aktuelle Zeile bekommen.

Meine Testtabelle heißt personen und hat die Felder ID und Person. Sie enthält folgende Testdaten:
Code:
ID  Person 
-----------------------
 1  Holger
 2  Stefan
 4  Olaf
 6  Peter
 7  Franz
Als Sortierkriterium habe ich die Spalte ID gewählt. Als Ergebnis sollen in einer Zeile der Personenname (Person) der aktuellen Zeile und der Name der Person der nächsten Zeile (NextRow) erscheinen.

Bei dem Query wird die Tabelle mit sich selbst verknüpft, wobei aus der verknüpften Tabelle nur die Zeilen übernommen werden, bei denen die ID (Sortierkriterium) der verknüpften Tabelle größer als in der Haupttabelle ist. Durch die Gruppierung nach der ID werden überflüssige Datensätze entfernt.

Da dadurch jedoch in undefinierter Reihenfolge ein Ergebnis der verknüpften Tabelle übrig bleibt, muss aus diesen Daten das kleinste aufgenommen werden. Dies geschieht mit dem angesprochenen CONCAT-SUBSTR-Konstrukt.
(Da dieses eine Alternative für Subquerys ist, müßte es auch mit einem Subquery zu lösen sein, aber dafür sitzt der Knoten in meinem Kopf gerade zu fest.)

Nun aber das Query und sein Ergebnis:
Code:
SELECT 
  p1.Person,
  SUBSTR(MIN(CONCAT(RPAD(p2.ID,20,' '), p2.Person)),21)
    AS NextRow 
FROM `personen` AS p1
LEFT JOIN `personen` AS p2
  ON p1.ID<p2.ID
GROUP BY p1.ID
ORDER BY p1.ID ASC


Ergebnis:

Person  NextRow
-----------------------
Holger  Stefan
Stefan  Olaf
Olaf    Peter
Peter   Franz
Franz    NULL

Vielleicht läßt sich dieses Query auch mit dem Ansatz von Tom verbinden, um dieses Konstrukt zu umgehen.

Wenn Du nicht nach dem Primärschlüssel sortierst, solltest Du bei Gleichheit des Feldes zur Eindeutigkeit auch nach dem Primärschlüssel sortieren. Das musst Du sowohl im ORDER BY, als auch in der ON-Bedingung berücksichtigen:
Code:
...
  ON (p1.NichtEindeutigesFeld<p2.NichtEindeutigesFeld)
    OR ((p1.NichtEindeutigesFeld=p2.NichtEindeutigesFeld)
      AND (p1.PrimaryKey<p2.PrimaryKey) )
...
ORDER BY NichtEindeutigesFeld ASC, PrimaryKey ASC
Gruß hpvw
 
Hallo!

Vielen Dank für Deine Mühe!!
Ich habe es mal mit Deinem Code für das Array versucht.
Nach einigen Überlegungen und einer langen Nacht hat nun doch alles geklappt (zumindest bis jetzt :))

Gruß

Christian
 

Neue Beiträge

Zurück