SQL eine Row nach oben springen...

R

Ronax

Hallo,

meine Struktur sieht folgender maßen aus:
Code:
id   	  name   	 Filename   	  date   	  width   	  height   	  kind   	  description
1  	Image1 	picture1  	2005-10-20  	500  	500  	jpg  	asdf
2 	Image2 	picture2 	2005-10-25 	500 	500 	jpg 	asdfgfgf
3 	Image3 	picture3 	2005-10-30 	412 	422 	jpg 	asdsdf
5 	Image4 	picture4 	2005-10-31 	500 	314 	jpg 	asdsdf

Der Table wird nach dem Datum sortiert ausgegeben...die einzelnen Zeilen werden anhand ihrer ID ausgelesen. Wie finde ich nun heraus, dass die Zeile mit der ID 5 nach der Zeile mit ID 3 kommt. Also einfach...wenn der Table nun sortiert nach Datum ausgeben wird und ich mir z.B. die Zeile mit der ID 3 schnappe
Code:
$result = mysql_query("select * from ".$this->SQL_Prefix."_".$this->currentGallery." WHERE id = 3")
Wie kann ich jetzt innerhalb der sortierten Tabelle eine Zeile nach unten bzw. oben springen?

Ich hatte mir gedacht, dass das z.B. mit LIMIT ganz ginge, hat dann aber doch nicht so geklappt:
Also die Idee war, dass ich mit einfach eine Zeile vor bzw. eine Zeile nach der Zeile mit der ID 3 ausgeben kann. Schien aber vom Syntax her nicht so ganz zu klappen und es gab Probleme, wenn ich das mit der letzten oder der aller ersten Zeile getan hatte.

danke
Florian
 
Zuletzt bearbeitet von einem Moderator:
Probier mal eine Abfrage nach folgendem Schema:
Code:
SELECT
        …
  FROM
        …
  WHERE
        `id` < 3
  LIMIT
        1
Dasselbe auch mit Größer-als.
 
Die Idee scheint gut zu sein...trotzdem lieftert das script mir als ergebnis nur eine 1 bei WHERE id < 3 obwohl die 2 dazwischen ist, trotz LIMIT...
 
Dann sortiere so, dass Du die 2 erhältst:
Code:
...
ORDER BY id DESC
LIMIT 1
Du musst den Vergleich und die Sortierung natürlich auf das Feld anwenden, was für die Sortierung zuständig ist. In Deinem Ursprungspost war das, wenn ich es richtig verstanden habe, ja das Datum und nicht die ID.

Gruß hpvw
 
hmm, klappt immernoch net...vielleicht stell' ich mich zu doof an :)

Code:
$LoopTo = array();
$Next_Range = mysql_query("select id from ".$this->SQL_Prefix."_".$this->currentGallery." WHERE id > ".$pic." order by 'date' asc LIMIT 1") or die ("Could not read data because ".mysql_error());	
$LoopTo[0] = mysql_result($Next_Range, 0);

$Prev_Range = mysql_query("select id from ".$this->SQL_Prefix."_".$this->currentGallery." WHERE id < ".$pic." order by 'date' asc LIMIT 1") or die ("Could not read data because ".mysql_error());	
$LoopTo[1] = mysql_result($Prev_Range, 0);

vorher hatte ich die Zeile mit der ID 3 ausgewählt
Code:
	$result = mysql_query("select * from ".$this->SQL_Prefix."_".$this->currentGallery." WHERE id = $pic") 
	or die ("Could not read data because ".mysql_error());

bei LoopTo[1] bekomme ich auch die nächste ID, jedoch bei LoopTo[0] steht immer eine 1 drinnen?!
Mit
Code:
"select id from ".$this->SQL_Prefix."_".$this->currentGallery." WHERE 'date' > ".$qry[date]." order by 'date' asc LIMIT 1";
scheint es auch nicht zu klappen...
$qry[date] ist das Datum des Bildes aus dem $result query...

(3 habe ich als Beispiel gewählt, da hier ja die Zeile mit der ID 4 fehlt)
 
Du must bei dem Vorgänger mit "DESC" und bei dem Nachfolger mit "ASC" sortieren. Außerdem sollte der Größer- bzw. Kleiner-Vergleich auf das gleiche Feld angewendet werden, wie die Sortierung.

Gruß hpvw
 
hmm, das problem ist, dass selbst wenn ich LIMIT 1 entferne, mein Query keine einzigen Rows zurückgibt. Also wenn ich nur sage WHERE 'date' < '2005-10-30' order by....., bekomme ich bei mysql_num_rows eine 0 zurück. Obwohl es mehrere geben müsste, folglich funktioniert es auch nicht, wenn ich ein LIMIT einfüge...

Entferne ich die Anführungsstriche bei '2005-10-30' so bekomme ich dann ohne LIMIT alle 4 rows. Füge ich ein LIMIT ein, so bekomme ich bei der < Abfrage die aller erste Zeile (mit dem niedrigsten Datum) und bei > bekomme ich gar keine Zeile...mit oder ohne LIMIT?!
 
Nochmal zum eigentlich Problem zurück, ich habe da etwas interessantes gefunden. Also, meine Nachher Abfrage klappt ja:
Code:
"SELECT id FROM db WHERE `id`>'9' AND `parent_album`='1' ORDER BY `date` AND `id` asc LIMIT 1"
Das gibt mir die nächstfolgende Zeile...umgekehrt kommt immer die Zeile mit der kleinsten ID:
Code:
"SELECT id FROM db WHERE `id`<'9' AND `parent_album`='1' ORDER BY `date` AND `id` desc LIMIT 1"
oder sei es asc oder sonst was. Das Problem hierbei könnte folgende Richtlinien bei Limit sein: Wenn Sie LIMIT # mit ORDER BY benutzen, beendet MySQL das Sortieren, sobald er die ersten # Zeilen gefunden hat, anstatt die gesamte Tabelle zu sortieren.
Aber leider gibt mySQL auch ohne ORDER BY nur die Zeile mit der kleinsten ID zurück :/
 
Dein Order-By ist murks. Richtig wäre:
Code:
... order by `spalte1`, `spalte2`
Du sortierst bei allen Zeilen nach einem boolschen Ergebnis.

Gruß hpvw
 
Zurück