Nach zwei Werten gleichzeitig sortieren (int und decimal)

Despoiler

Erfahrenes Mitglied
Hallo,

ich sitzte schon wieder mal seit mehreren Stunden vor einem Problem.
Ich möchte die Möglichkeit haben meine Bilder nach der Bewertung zu sortieren.
Das klappt in der Übersicht auch ohne weiteres, es werden pro Seite 12 Bilder ausgegeben und absteigend sortiert.

Jetzt klicke ich das gewünschte Bild an und gelange auf die nächste Seite, die mir das Bild etwas größer und mit allen Details ausgibt.

Ich möchte auf dieser Seite eine Navigation (Bild zurück/Bild vor) einbauen, welche immer das nächste bessere Bild bzw. das nächste schlechtere Bild ausgibt.

Meine Tabelle (verkürzt):
EOSID int(11)
EOSMark decimal(3,2)

Mein Code:
PHP:
$mark = mysql_query("SELECT EOSMark FROM images_eos WHERE EOSID = '" . $_GET["id"] . "'"); 
$mark = mysql_result($mark, 0); 
$idforward = mysql_query("SELECT EOSID, EOSMark FROM images_eos WHERE EOSMark >= '$mark' AND EOSID != '" . $_GET["id"] . "' ORDER BY EOSMark, EOSID ASC");
$forward = mysql_fetch_array($idforward);
$idback = mysql_query("SELECT EOSID, EOSMark FROM images_eos WHERE EOSMark <= '$mark' ORDER BY EOSMark DESC, EOSID ASC"); 	
$back = mysql_fetch_array($idback);

Mein Problem:
Die Abfrage funktioniert, wenn ich aber die ID 17 habe mit der Note 5.00, dann zeigt er mir auch das nächste Bild (ID 12 mit der Note 5.00) an.
Danach würden aber noch mehr Bilder mir der Note 5.00 kommen, er springt aber immer zwischen ID 17 und 12 hin und her, weil beide die gleiche Note haben.

Wie könnte ich das denn bewerkstelligen, dass ich durch die ganze Liste navigieren kann?

Hoffentlich habe ich mich einigermaßen verständlich ausgedrückt. ;)
 
Ob mein Vorschlag schön ist oder nicht, darüber darf man sich gerne streiten. Mir gefällt er ja nicht einmal selbst so richtig. ;)

Du könntest bei gleicher Bewertung zusätzlich nach Id sortieren und auf kleiner oder größer prüfen.

PHP:
$idforward = mysql_query("SELECT EOSID, EOSMark FROM images_eos WHERE (EOSMark = '$mark' AND EOSID >= '" . $_GET["id"] . "') OR (EOSMark >= '$mark' AND EOSID != '" . $_GET["id"] . "') ORDER BY EOSMark, EOSID ASC");

Bei der anderen Query muss das natürlich ebenfalls angepasst werden, nur mit einem "<", statt dem ">".
 
Guten Morgen DeluXe,

schön, dass du mal wieder versuchst mir zu helfen. ;)

Das was du geschrieben hast scheint nur logisch zu sein. Ich hab dir mal ein Bild mit den Ergebnissen angehängt, die die SQL-Abfrage zurückgibt.

Du hast Recht. Ich sortiere ja im zweiten Schritt nach der EOSID, somit muss ja die nächste EOSID immer größer sein, selbst wenn die EOSMark den gleichen Wert besitzt.

Ich werde das testen und dir umgehend bescheidgeben. :)
 

Anhänge

  • eos_sql.jpg
    eos_sql.jpg
    80,3 KB · Aufrufe: 27
Moin, moin auch. :)

schön, dass du mal wieder versuchst mir zu helfen. ;)
Noch schöner, wenn sich die Leute auch an einen erinnern. :D

Auch wenn mir in der Query ein, zwei..oder auch drei Fehler unterlaufen sind, wie ich eben sehe..
Wenn da kein grober Denkfehler dabei ist sollte das wohl ohne große Umstände so machbar sein. ;)
 
Noch schöner, wenn sich die Leute auch an einen erinnern. :D

Na klaro, wie könnte ich das vergessen! :)

Also ich hab jetzt ein wenig rumprobiert und bin zu folgendem Ergebnis gekommen.

Hier meine Abfrage:
PHP:
SELECT EOSID, EOSMark FROM images_eos WHERE EOSMark >= '1.00' AND EOSID > '21' ORDER BY EOSMark ASC, EOSID ASC

Das Ergebnis kannst du unten im Bild erkennen. Ich habe mal die Beispielwerte 1.00 (für EOSMark) und 21 (für EOSID) genommen.
Als nächstes wäre also die 2.00 dran, die er auch ausgibt und nach der EOSID sortiert. Nur dann kommt die 3.00 und die EOSID ist ab dann nicht mehr größer als die Letzte.

Ich glaube wir befinden uns auf dem richtigen Weg.
Irgendwie fällt mir das Denken heute sehr schwer, liegt wahrscheinlich am Feiertag! ;)
 

Anhänge

  • eos_sql_01.jpg
    eos_sql_01.jpg
    94,5 KB · Aufrufe: 13
Deswegen habe ich in der Query mit einem OR gearbeitet. ;)

Weil du hast zwei Fälle:
1. EOSMark ist gleich und die EOSID größer
2. nur die EOSMark ist größer

Das immer der nächst größere Wert ausgegeben wird gewährleistet ja die Sortierung.
Wenn du allerdings vor hast ein "paar mehr" - sprich mehr als ein paar tausend ;) - Einträge in dieser Tabelle zu haben, sollten wir uns für das ORDER BY auch noch etwas anderes einfallen lassen, da das sehr schnell die Performance in den Keller ziehen kann.

Somit müsste deine Query so aussehen:
PHP:
 SELECT EOSID, EOSMark FROM images_eos WHERE (EOSMark = '1.00' AND EOSID > '21') OR (EOSMark > '1.00') ORDER BY EOSMark ASC, EOSID ASC;

Was mir eben noch auffällt:
Welchen Datentyp haben die beiden Spalten bei dir?
 
Zuletzt bearbeitet:
Deswegen habe ich in der Query mit einem OR gearbeitet. ;)

Äh! ;)
Das lässt jetzt einiges klarer erscheinen. Tut mir leid, dass ich dein OR übergangen habe. ;-]

Das funktioniert super! Jetzt muss ich dann nur noch das Selbe für die andere Richtung ausgeben, ich denke mal das bekomme ich hin.

Sei mir nicht böse, ich muss jetzt erstmal mit der Frau raus in die Sonne, sonst bekomme ich noch Ärger, wenn ich den ganzen Tag wieder vor der Kiste sitze.
Ich mach mich heute abend nochmal dran und sag dir Bescheid wenn alles läuft. *g*

Vielen vielen Dank schonmal! Du bist ein Schatz! :)

Bis später


EDIT:
Die Datentypen sind: EOSID int(11) und EOSMark decimal(3,2)

Hehe das hast du jetzt übersehen, das steht schon in meinem Eröffnungspost! ;)
 
So da bin ich wieder.

Mein Code schaut jetzt wie folgt aus und ich muss sagen, er rennt wie der Teufel! :)

PHP:
$mark = mysql_query("SELECT EOSMark FROM images_eos WHERE EOSID = '" . $_GET["id"] . "'"); 
$mark = mysql_result($mark, 0); 
$idforward = mysql_query("SELECT EOSID, EOSMark FROM images_eos WHERE (EOSMark = '$mark' AND EOSID < '" . $_GET["id"] . "') OR (EOSMark < '$mark') ORDER BY EOSMark DESC, EOSID DESC");
$forward = mysql_fetch_array($idforward);	
$idback = mysql_query("SELECT EOSID, EOSMark FROM images_eos WHERE (EOSMark = '$mark' AND EOSID > '" . $_GET["id"] . "') OR (EOSMark > '$mark') ORDER BY EOSMark ASC, EOSID ASC");	
$back = mysql_fetch_array($idback);


Hab vielen Dank, das war bestimmt nicht das letzte Mal.
Soll jetzt keine Drohung sein! ;)
 
Zurück