Ergebnis mehrfach durchlaufen ohne erneute Abfrage

Hallo,

ich frage mit $ergebnis_img = mysql_query($abfrage_img) eine Mysql-Datenbank ab. Mit while ($row_img = mysql_fetch_object($ergebnis_img)) frage ich nun Ergebniszeile für Ergebniszeile ab. Nun habe ich aber das Problem, daß ich den selben Ergebnisbereich wiederholt durchlaufen möchte, ohne jedes mal die Daten erneut mit mysql_query abfragen zu müssen. Ich möchte die Daten aber möglichst dazu auch nicht in einem Array zwischenspeichern müssen.
Geht das? Wenn ja, wie?

Gruß

Thomas

Wenn Du vorab weisst, wie oft Du den Ergebnisbereich haben willst,
(hier 6 mal ) dann nimm union.
ALL ist wichtig.
ALL sollte auch dazu führen,
das auch die SQL Engine die Ergebnisse
nicht zwischenspeichert.

select … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query

Allerdings könnte die Reihenfolge
unbestimmt sein. Das heist Du kriegst
den Ergebnisbereich nicht 6 mal hintereinander,
sondern ein Zeile 6 mal hintereinander.
Dazu müsstest Du eine Konstante einbauen.

select ‚Query1‘ as q, … deine Query
UNION ALL ‚Query2‘ as q, … deine Query
UNION ALL ‚Query3‘ as q, … deine Query
UNION ALL ‚Query4‘ as q, … deine Query
UNION ALL ‚Query5‘ as q, … deine Query
UNION ALL ‚Query6‘ as q, … deine Query
order by q

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Wenn Du vorab weisst, wie oft Du den Ergebnisbereich haben
willst,
(hier 6 mal ) dann nimm union.

Ja, das wüßte ich.

ALL ist wichtig.
ALL sollte auch dazu führen,
das auch die SQL Engine die Ergebnisse
nicht zwischenspeichert.

select … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query

Allerdings könnte die Reihenfolge
unbestimmt sein. Das heist Du kriegst
den Ergebnisbereich nicht 6 mal hintereinander,
sondern ein Zeile 6 mal hintereinander.
Dazu müsstest Du eine Konstante einbauen.

select ‚Query1‘ as q, … deine Query
UNION ALL ‚Query2‘ as q, … deine Query
UNION ALL ‚Query3‘ as q, … deine Query
UNION ALL ‚Query4‘ as q, … deine Query
UNION ALL ‚Query5‘ as q, … deine Query
UNION ALL ‚Query6‘ as q, … deine Query
order by q

Wie sollte ich nun aber meine while-Schleife stoppen, wennd er 1. Durchlauf beendet ist, so daß ich die restliche Ergebnismenge dann in der nächsten while-Schleife weiterbearbeiten kann? Ausserdem stellt sich weiter die Frage, wie oft werden bei dieser Abfrage die Daten tatsächlich vom Server abgefragt? Ein mal und dann um Ergebnis vervielfacht, oder 6 mal, da eigentlich ja 6 Queries zusammengebaut werden. Dann hätte ich ja bzgl. der Serverbelastung keinen Vorteil gegenüber einer erneuten Abfrage, um den Ergebnisbereich ein weiteres mal zu durchlaufen.

Gruß

Thomas

Wenn Du vorab weisst, wie oft Du den Ergebnisbereich haben
willst,
(hier 6 mal ) dann nimm union.
ALL ist wichtig.
ALL sollte auch dazu führen,
das auch die SQL Engine die Ergebnisse
nicht zwischenspeichert.

select … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query
UNION ALL … deine Query

Allerdings könnte die Reihenfolge
unbestimmt sein. Das heist Du kriegst
den Ergebnisbereich nicht 6 mal hintereinander,
sondern ein Zeile 6 mal hintereinander.
Dazu müsstest Du eine Konstante einbauen.

select ‚Query1‘ as q, … deine Query
UNION ALL ‚Query2‘ as q, … deine Query
UNION ALL ‚Query3‘ as q, … deine Query
UNION ALL ‚Query4‘ as q, … deine Query
UNION ALL ‚Query5‘ as q, … deine Query
UNION ALL ‚Query6‘ as q, … deine Query
order by q

Hallo zusammen,

die Idee ist nur als supoptimal zu bezeichnen. Damit wird der Server und die Platten nur mehrfach belastet. Anstatt eines mysql_fetch_row wäre eventuell der Einsatz vom mysql_fetch_array sinnvoller. Das Array kann dann vom Client beliebig durchlaufen werden.

Hinweis: Ist aber auch nur sinnvoll, wenn nicht unendlich viele Datensätze kommen.

MfG Georg V.

Du müsstest dann diese Konstante abfragen,
ob sie noch den wert hat, den sie eine Zeile vorher hatte.

if(oldconst!=const){ /*also Query3 ungleich Query2)*/
Gruppenwechsel blah blah

}
oldconst=const

Die Plattenbelastung, tja,
einen Tod muss man immer sterben.
wenn man einen grossen vollgestellten Keller hat,
und nur einen kleinen Kellerflur,
tja dann muss man eben mehr kramen,
als wenn man einen grossen Kellerflur
hätte, um den Keller mal zu durchforsten,
nach Sachen die zusammenpassen.
Vielleicht hat dein SQL-System
ja so ne Art Query Cache.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]