URL: https://www.overclockers.at/coding-stuff/mysql_query_next_previous_link_167189/page_1 - zur Vollversion wechseln!
Hallo Leute,
Eigentlich ist das Problem ja trivial, aber ich stehe anscheinend auf der Leitung.
Ich habe Attribute zu Bildern in einer Db stehen und möchte eine Slideshow daraus machen bei der Next und Previous Links vorhanden sind.
Die IDs der Elemente sind nicht sortiert, da anderen Daten die Reihenfolge vorgeben.
Wie kann ich die IDs dieser Elemente per SQL Query rausbekommen?
Folgender Query liefert alle Elemente für die Slideshow:
Code:SELECT artworks.artwork_id, artworks.extension, artworks.style_id, artworks.technique_id, artworks.theme_id, artworks.user_id, users.firstname, users.lastname, types.name_de type FROM artworks, users, types WHERE artworks.status = '2' AND users.visible = '1' AND artworks.user_id = users.user_id AND artworks.type_id = types.type_id AND artworks.type_id = '2' AND artworks.technique_id = '10' ORDER BY artworks.rating, ( SELECT RIGHT(artworks.date, 2) ) ASC
LIMIT offset, rowcount
?
Naja, auf der entsprechenden Seite, kenn ich im prinzip nur die ID des aktuellen Bilds + die entsprechenden Zusatzbedingungen.
An welcher Stelle das aktuelle Bild steht, weiß ich nicht genau ... Vorallem kann man bei LIMIT keine negativen Werte verwenden um auf den previous link zu kommen ...
Dann übergib an dein Skript einfach immer die aktuelle Seite!
Natürlich könntest du das auch komplizierter mit Subqueries usw. lösen aber imho ist hier "keep it simple" der bessere Ansatz.
Übrigens: Bei Gallerien stört es mich eigentlich immer, dass, wenn man auf weiter klickt, die ganze Seite neu geladen wird (dann muss man evtl. noch ein bisschen runterscrollen um das Bild zu sehen ...), obwohl im Grunde nur ein Bild ausgetauscht wird. Könntest du mal probieren, das mit JavaScript zu lösen, also wenn man auf weiter klickt wird einfach das Bild mit dem nächsten vertauscht? Zusätzlich könnte man dann das nächste Bild preloaden, so dass, wenn man auf "Nächstes Bild" klickt, dieses sofort angezeigt wird. Das wär mal eine coole Gallerie.
Naja, das is ja mein Problem!
Alle IDs im Array gehören zur Slideshow.Code:SELECT artworks.artwork_id, artworks.extension, artworks.style_id, artworks.technique_id, artworks.theme_id, artworks.user_id, users.firstname, users.lastname, types.name_de type FROM artworks, users, types WHERE artworks.status = '2' AND users.visible = '1' AND artworks.user_id = users.user_id AND artworks.type_id = types.type_id AND artworks.type_id = '4' AND artworks.technique_id = '1' ORDER BY artworks.rating, ( SELECT RIGHT(artworks.date, 2) ) ASC id-Array ( [0] => 51 [1] => 1 [2] => 70 [3] => 24 [4] => 47 [5] => 9 [6] => 32 [7] => 25 [8] => 35 [9] => 68 [10] => 63 [11] => 64 [12] => 61 )
Du willst das ganze mit PHP lösen nehme ich an. Afaik kannst in der Ergebnismenge deinen Pointer dahinsetzte wo du willst. mit fetch_row wird er zb immer um eins erhöht, aber man den den auch eines erniedrigen. In den ODBC Funktionen ist sowas enthalten, aber sicher auch in den vom Mysql.
Edit: HIER
mysql_data_seek() bewegt den internen Datensatz-Zeiger eines Anfrageergebnisses zum Datensatz mit der übergebenen Nummer. Der nächste Aufruf von mysql_fetch_row() liefert den entsprechenden Datensatz.
Auf diese Idee bin ich noch nicht gekommen. Leider denke ich, dass sie in diesem Fall nicht helfen wird, weil dabei erst alle Zeilen ausgelesen werden und das wird zu langsam sein =/
So wie ich das im Moment sehe, wird wohl nichts anderes über bleiben als das Ergebnis zu cachen und nur neu auszulesen, wenn sich an den Rahmenbedingungen etwas ändert.
Wo ist bitte das Problem?
Angenommen dein Skript heißt slideshow.php.
Erste Seite:
slideshow.php?page=0
Zweite Seite:
slideshow.php?page=1
...
Code:... $current = mysql_query("SELECT ... LIMIT " . $page . ", 1"); bild ausgeben... if ($page > 0) echo '<a href="slideshow.php?page=' . ($page - 1) . '">Zurück</a>'; if ($page < $last) echo '<a href="slideshow.php?page=' . ($page + 1) . '">Nächstes</a>';
Das Problem ist, dass sich die Bilder auf der Seite (zB 1) ändern, sobald ein neues Bild hinzugefügt wird. Damit würde sich ein Bookmark auf Seite 1 immer mit neuem Bild öffnen.
Dieses Problem kommt daher, da die Bilder nicht nach ID oder Datum etc. sortiert werden (welche ja kontinuierlich zunehmen würden). Sondern eben nach dem Rating und um eine gewisse Zufälligkeit innerhalb des selben Ratings zu bekommen an zweiter Stelle nach einem Teil des Datums sortiert sind.
Ich hoffe ich habe mich klar ausgedrückt.
Aha verstehe...
So vielleicht?Code:SELECT ... WHERE ... AND (artworks.rating < $currentrating OR (artworks.rating = $currentrating AND RIGHT(artworks.date, 2) < '$currentdate'))) ORDER BY ... DESC LIMIT 1 UNION SELECT ... WHERE ... AND (artworks.rating > $currentrating OR (artworks.rating = $currentrating AND RIGHT(artworks.date, 2) > '$currentdate'))) ORDER BY ... ASC LIMIT 1
WOW!
Das sieht mal sehr gut aus! Vielen Dank!
Werd das mal richtig implementieren und mich dann wieder melden!
Eigentlich braucht das mitn Pointer garnicht lange. Zurzeit hab ich eine Page wo 5000 Datensätze ausgegeben werden.
Ist nicht wirklich sinnvoll, aber das was Zeit braucht ist nicht das generieren der Page, sonder der Browser brauch seine Zeit bis er alle Elemente darstellt. Das mitn Pointer durch den Datensatz wandern, macht eigentlich was ich weiß sowieso jede Anwendung. Die Ergebnismenge selbst liegt ja im DBMS und du ziehst immer nur die Zeile raus die du willst, alles auf einen Rutsch geht eh nicht.
hm. Ich verstehe was du meinst. Wäre halt interessant was in meinem Fall wirklich schneller ist.
Noch komm ich mit dem query von gue nicht ganz zu recht. aber vielleicht wird das ja noch was
Ja eh deine Sache aud die Performance schaun is nie a Fehler.
Andererseits, was hilft jemanden eine Anwendung die super schnell is aberf 1 Jahr zu spät rauskommt
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025