Previous und Next Link für Gallery
am 14.08.2006 18:23:07 von Christoph Wagner
Hallo alle zusammen!
Mit folgendem Query lese ich alle passenden Files aus der DB aus und
sortiere sie richtig.
Jetzt ist das natürlich bei mehreren 100 Bildern nicht sehr optimal.
Ich würde gerne einen (können auch mehrere) Queries haben, die mir nur
die IDs des aktuellen, des letzen und des nächsten Bildes liefern (ohne,
dass die Sortierung dabei geändert wird).
Der Query:
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.style_id = ''
ORDER BY artworks.rating,
(
SELECT RIGHT(artworks.date, 2)
) ASC
Die Ausgabe zB (der Einfachheit halber nur die IDs):
id-Array
(
[0] => 17
[1] => 51
[2] => 8
[3] => 1
[4] => 24
[5] => 47
[6] => 9
[7] => 32
[8] => 25
[9] => 35
[10] => 10
[11] => 23
)
Als Beispiel:
Ich habe per $_GET die ID 9 übergeben. Jetzt wäre es eine Möglichkeit,
wenn ich die Daten von 47, 9, 32 zurückgeliefert bekommen würde.
Die andere Variante wäre nur die Daten von 9 zu bekommen und dafür nur
die IDs 47 und 32 für die Links.
Mir ist leider kein passender Query eingefallen =/
Einzige Lösung die ich im Moment hätte, ist, dass ich mir das Array in
einer Session merke und nur erneuere, wenn sich etwas an den Kriterien
ändert.
Vielleicht kann mir hier jemand helfen.
Vielen Dank im Voraus!
Christoph
Re: Previous und Next Link für Gallery
am 14.08.2006 18:28:03 von Carsten Wiedmann
Christoph Wagner schrieb:
> Ich würde gerne einen (können auch mehrere) Queries haben, die mir nur
> die IDs des aktuellen, des letzen und des nächsten Bildes liefern (ohne,
> dass die Sortierung dabei geändert wird).
Grundsätzlich wird das z.B. hier erklärt:
17.10. Ich habe eine Tabelle mit n Einträgen und möchte auf jeder Seite m
davon anzeigen
http://www.php-faq.de/q/q-mysql-seitenweise.html
Gruß
Carsten
Re: Previous und Next Link für Gallery
am 14.08.2006 18:54:03 von Christoph Wagner
Carsten Wiedmann schrieb:
> Christoph Wagner schrieb:
>
>> Ich würde gerne einen (können auch mehrere) Queries haben, die mir nur
>> die IDs des aktuellen, des letzen und des nächsten Bildes liefern (ohne,
>> dass die Sortierung dabei geändert wird).
>
> Grundsätzlich wird das z.B. hier erklärt:
> 17.10. Ich habe eine Tabelle mit n Einträgen und möchte auf jeder Seite
> m davon anzeigen
> http://www.php-faq.de/q/q-mysql-seitenweise.html
Danke für die Antwort.
Leider sollte es eine Lösung geben, die auf der ID des aktuellen Bilds
aufbaut, da man ansonsten kein Bookmark auf dieses anlegen kann.
Sobald sich bei der "Start, Limit" Lösung die Anzahl der ausgegeben
Bilder ändert, ändert sich auch die Position des gewünschten Bildes im
Array.
Ansonsten wäre das auf alle Fälle die eleganteste Lösung.
Gruß
Christoph
Re: Previous und Next Link für Gallery
am 14.08.2006 19:26:56 von Niels Braczek
Christoph Wagner schrieb:
> Ich würde gerne einen (können auch mehrere) Queries haben, die mir =
nur
> die IDs des aktuellen, des letzen und des nächsten Bildes liefern (oh=
ne,
> dass die Sortierung dabei geändert wird).
Das hört sich nach einem Problem an, das wir hier vor Jahren mal gelö=
st
haben:
Vorhergehenden/nächsten Datensatz finden
Keita Ito schlug dafür diese Lösung vor, die auf den ersten Blick seh=
r
elegant wirkt:
SELECT a.id AS prev,
b.id AS cur,
c.id AS next
FROM my_table AS a,
my_table AS b,
my_table AS c
WHERE a.id < 13
AND b.id =3D 13
AND c.id > 13
ORDER BY a.id DESC,
c.id ASC
LIMIT 0, 1
Diese Variante funktioniert aber nicht, wenn der aktuelle Datensatz der
erste oder der letzte ist. Matthias P. Wuerfl brachte daraufhin
nachstehende Änderungen ein. Diese Version findet auch die 'Endstücke=
':
SELECT a.id AS prev,
b.id AS cur,
c.id AS next
FROM my_table AS b
LEFT JOIN my_table AS a ON a.id < b.id
LEFT JOIN my_table AS c ON c.id > b.id
WHERE b.id =3D 13
ORDER BY a.id DESC,
c.id ASC
LIMIT 0, 1
Beide Varianten haben das Problem, dass sie bei großen Datenbeständen=
sehr lange Laufzeiten haben. Daraufhin entwickelte ich die nachstehende
optimierte Variante.
function prevCurNext4($table, $id, $sortField, $sortValue, $condition=3D'=
')
{
if ($condition>'') $condition=3D' AND '.$condition;
// MySQL ab V4.x
$sqlStr =3D "(SELECT $id AS id,
'prev' AS k
FROM $table
WHERE $sortField < $sortValue
$condition
ORDER BY $sortField DESC
LIMIT 0,1)
UNION (SELECT $id AS id,
'cur' AS k
FROM $table
WHERE $sortField =3D $sortValue
$condition)
UNION (SELECT $id AS id,
'next' AS k
FROM $table
WHERE $sortField > $sortValue
$condition
ORDER BY $sortField ASC
LIMIT 0,1)";
$result =3D mysql_query($sqlStr) or die($sqlStr.'
'.mysql_error())=
;
$set =3D array();
while ($row=3Dmysql_fetch_assoc($result)) {
$set[$row['k']] =3D $row['id'];
}
return $set;
}
function prevCurNext3($table, $id, $sortField, $sortValue, $condition=3D'=
')
{
if ($condition>'') $condition=3D' AND '.$condition;
// MySQL < V4.x
$sqlStr =3D "SELECT $id AS id
FROM $table
WHERE $sortField < $sortValue
$condition
ORDER BY $sortField DESC
LIMIT 0,1";
$result =3D mysql_query($sqlStr) or die($sqlStr.'
'.mysql_error())=
;
$row =3D mysql_fetch_assoc($result);
$set['prev'] =3D $row['id'];
$sqlStr =3D "SELECT $id AS id
FROM $table
WHERE $sortField =3D $sortValue
$condition";
$result =3D mysql_query($sqlStr) or die($sqlStr.'
'.mysql_error())=
;
$row =3D mysql_fetch_assoc($result);
$set['cur'] =3D $row['id'];
$sqlStr =3D "SELECT $id AS id
FROM $table
WHERE $sortField > $sortValue
$condition
ORDER BY $sortField ASC
LIMIT 0,1";
$result =3D mysql_query($sqlStr) or die($sqlStr.'
'.mysql_error())=
;
$row =3D mysql_fetch_assoc($result);
$set['next'] =3D $row['id'];
return $set;
}
function prevCurNext($table, $id, $sortField, $sortValue, $condition=3D''=
)
{
$sqlStr =3D "SELECT LEFT(VERSION(),1) AS major";
$result =3D mysql_query($sqlStr) or die($sqlStr.'
'.mysql_error())=
;
$row =3D mysql_fetch_assoc($result);
if ($row['major']>3) {
$set =3D prevCurNext4($table, $id, $sortField, $sortValue,
$condition);
} else {
$set =3D prevCurNext3($table, $id, $sortField, $sortValue,
$condition);
}
return $set;
}
$set =3D prevCurNext('my_table', 'id', 'id', 2000);
HTH
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Previous und Next Link für Gallery
am 14.08.2006 20:21:23 von Christoph Wagner
Niels Braczek schrieb:
> Beide Varianten haben das Problem, dass sie bei großen Datenbeständen
> sehr lange Laufzeiten haben. Daraufhin entwickelte ich die nachstehende
> optimierte Variante.
Könntest du mir vielleicht auch ein Beispiel nennen damit ich leichter
hinter den genauen Ablauf deiner Funktion kommen kann?
Von dem was ich bisher gesehen habe, denke ich, dass ich ein Problem mit
dem $sortField haben werde, da ich ja nach
artworks.rating,(SELECT RIGHT(artworks.date, 2)) ASC
sortieren muss.
Warum dieser komplexe ORDER BY Term sein muss, ist leicht gesagt.
Es sollen alle Werke ausgegeben werde, benotet nach ihrem Rating. Dabei
darf aber ein Künstler nicht bevorzugt werden (= es soll eine
"zufällige" Reihenfolge erreicht werden). Dies passsiert über den
zweiten Teil mit dem SUBQUERY.
Liebe Grüße
Christoph