Hallo
Hier mal ein etwas komplizierteres Anliegen.
Da ich durch einen Datenzugriff auf den MySQL Server eh schon mit dem Server verbunden bin, wollte ich die Sortierung der Daten dort auch gleich ablaufen lassen.
Davor hatte ich dies mit PHP geregelt, indem ich ALLE Daten gezogen habe und dann denn Array über usort nach dem 'created_at' und 'id' keyword sortieren lassen habe.
Mein Ziel ist, die Daten zu splitten, um verschiedene Seiten zu erstellen.
Da ich aber nicht alle Daten ziehen will (verbraucht ja extrem viel Performance), sondern mit dem MySQL Keyword limit arbeiten möchte, muss ich bevor LIMIT überhaupt ab einem bestimmten Wert aufhört, die Daten zu holen, diese vorher sortieren.
Weiß jemand, wie das möglich ist?
Bisher habe ich folgendes:
function getLastId($index, $limit)
{
global $pdoConStr;
global $pdoConUser;
global $pdoConPass;
$pdo2 = new PDO($pdoConStr, $pdoConUser, $pdoConPass);
$statement = $pdo2->prepare("SELECT id, created_at FROM bilder ORDER BY created_at DESC, id ASC LIMIT $limit");
$result = $statement->execute();
$firstOne = $statement->fetch();
$lastId = $firstOne['id'] - 1;
$lastNewest = $firstOne['created_at'];
for($x = 0; $x < $index; $x++)
{
$last = getNewest($pdo2, $limit, $lastId, $lastNewest);
$lastId = $last['lastId'];
$lastNewest = $last['lastNewest'];
}
return $lastId;
}
function getNewest($pdo2, $limit, $lastId, $lastNewest)
{
$statement = $pdo2->prepare("SELECT id, created_at FROM bilder WHERE id > $lastId AND created_at <= $lastNewest ORDER BY created_at DESC, id ASC LIMIT $limit");
$result = $statement->execute();
$list = $statement->fetchAll();
$newest = "";
if (count($list) != $limit) :
$newest = getNewest($pdo2, $limit - count($list), -1, $lastNewest);
return $newest;
endif;
$newest['lastId'] = $list[count($list)-1]['id'];
$newest['lastNewest'] = $list[count($list)-1]['created_at'];
return $newest;
}
Alles anzeigen
Das Problem hierbei ist, dass die ID unabhängig vom Erstellungsdatum ist. Normalerweise ist das Erstellungsdatum ja immer, je größer die ID ist, jünger. Doch ich will, dass es auch funktioniert, wenn man das Erstellungsdatum ändert.
so kann es sein, dass die ID 3 später erstellt wurde, als ID 4 (normalerweise andersherum).
Das Problem in meiner Abfrage ist, dass man, wenn man checkt, ob eine ID größer als die letzte ist, das nicht mehr geht. Gerade wegen dem eben beschriebenen Problem.
Generell will ich die letzte ID der Daten haben, die es auf einer Seite gibt (Seitengröße: 28 Daten).
Und falls mehrere Daten zur gleichen Zeit erstellt wurden, muss ich ja noch die ID mit überprüfen. Nur durch den Eintrag in die WHERE-Klausel mit id < $lastId unterdrückt man ja die kleineren IDs, die aber ggf ein neueres Erstellungsdatum haben...
Ich weiß, das ist sehr kompliziert und ich zerbreche mir hierbei auch langsam den Kopf
Mit freundlichen Grüßen,
Alf21