"We are back" « oc.at

Mysql Query; next previous link

Maehmann 14.08.2006 - 15:28 1431 13
Posts

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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

Eigentlich müsste sich dieser Query anpassen lassen, oder?

Liebe Grüße und TIA

Christoph

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
LIMIT offset, rowcount
?

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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 ...

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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 :rolleyes: ...), 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.

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Naja, das is ja mein Problem!

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
)
Alle IDs im Array gehören zur Slideshow.

Ich weiß, dass das aktuelle Bild (zB) die ID 68 hat.
Jetzt könnt ich einfach in dem array nach der richtigen IDs suchen ...
Das Problem dabei ist, dass ich nicht 10 sondern >900 Datensätze habe.
Also alle auslesen in das array schreiben und dann die richtigen IDs suchen, wird einfach zu langsam sein. Die Frage ist, wie ich den Query abändern muss, damit ich die richtigen 3 Zeilen rausbekomm.

shadowman

OC Addicted
Registered: Oct 2000
Location: Feldkirchen
Posts: 1612
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.
Bearbeitet von shadowman am 14.08.2006, 22:43

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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.

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
:confused: :confused: :confused:
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>';

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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.

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Aha verstehe...
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
So vielleicht?

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
WOW!

Das sieht mal sehr gut aus! Vielen Dank!

Werd das mal richtig implementieren und mich dann wieder melden!

shadowman

OC Addicted
Registered: Oct 2000
Location: Feldkirchen
Posts: 1612
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.

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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 :)

shadowman

OC Addicted
Registered: Oct 2000
Location: Feldkirchen
Posts: 1612
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 :D
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz