MySql 5.0.83 + .Net Connector - Problem mit Nutzer-Variablen

CPoly

Mitglied Weizenbier
Hi,

Folgendes: Ich habe eine Fotogalerie und vereinfacht will ich beim Betrachten der Fotos aus einem Album feststellen, ob noch ein Nachfolger vorhanden ist, ansonsten soll der "weiter"-Button ausgeblendet werden. So gehe ich vor

SQL:
SELECT photoid FROM photos WHERE albumid=123 ORDER BY photoid LIMIT 100, 2;

Sollte in dem Fall das ein-hundertste Fotos auslesen. Wenn ich jetzt prüfe, ob auch ein zweiter Datensatz mitkam, weiß ich, dass es ein weiteres Foto gibt. So weit alles kein Problem.

Aber: Jetzt muss ich aus einer weiteres Tabelle Infos über das Foto auslesen. Da ich das alles in einer Abfrage machen möchte, merke ich mir also die photoid in einer Nutzer-Variablen.

SQL:
SELECT @photoid:=photoid FROM photos WHERE albumid=123 ORDER BY photoid LIMIT 100, 2;
SELECT infos FROM photo_infos WHERE photoid=@photoid;

Funktioniert prinzipiell auch, nur dass die Infos des zweiten Fotos ausgelesen werden, da die Variable ja überschrieben wird. Also dachte ich mir, frag ich ab, ob die Variable bereits gesetzt ist.

SQL:
SELECT IF(@photoid IS NULL, @photoid:=photoid, photoid) FROM photos WHERE albumid=123 ORDER BY photoid LIMIT 100, 2;

Zuerst dachte ich auch, dass macht genau was ich will, aber dann hat es scheinbar zufällig doch wieder die falschen Daten ausgelesen. Dann kam ich auf die Idee, dass es am Connection-Pooling liegen könnte. Also "pooling=false;" in den Connection-String und dann hat alles funktioniert. Aber da ich pooling nutzen möchte, hab ich überlegt die Variablen zu Beginn meiner Abfragen einfach auf NULL zu setzen.

SQL:
SET @photoid:=NULL;
SELECT IF(@photoid IS NULL, @photoid:=photoid, photoid) FROM photos WHERE albumid=123 ORDER BY photoid LIMIT 100, 2;
SELECT infos FROM photo_infos WHERE photoid=@photoid;

Aber irgendwie liefert das immer noch nicht das richtige Resultat. Und komisch ist, wenn ich pooling auf false setzen und danach wieder auf true, geht es auf einmal.

Was mache ich falsch?
 
Es hat zwar etwas gedauert, aber eben ist mir wie aus dem Nichts aufgefallen, wo das Problem/ der Denkfehler liegt (Ich hab gerade eigentlich an einer völlig anderen Stelle gearbeitet). Die Daten werden ja nicht in der Reihenfolge durchlaufen, welche ich bei ORDER BY festlegt habe, sondern so, wie MySql sie eben von der Platte/aus dem RAM ließt. Also bekanntlich ohne irgendeine Sortierung. Also kann ich nicht so vorgehen, wie ich eigentlich wollte.

Ich habe aber bereits eine Lösung. Ich mache die erste Abfrage einzeln, prüfe ob es einen oder zwei Treffer gab und lese dann erst in mehreren Abfragen die Infos aus. Diese Abfragen spare ich mir dann auch, falls die erste gar keine Treffer liefert (veraltete URL z.b.)

Edit: So ganz schlüssig ist meine Erklärung doch nicht, aber ich gebe mich mit der Alternativen Lösung zufrieden.
 
Zuletzt bearbeitet:
Zurück