Sortieren und Group BY

lisali

Erfahrenes Mitglied
Hi,

es geht darum, dass ich eine Übersicht von Mails habe, die man empfängt.

Und ich möchte nach User sortiert anzeigen lassen UND nach neuesten Mails sortieren (die ganz oben stehen).

Ich hab' folgendes SQL-Statement:

Code:
$result = mysql_query("
SELECT m.`id` AS message_id, m.`text`, m.`sid`, m.`status`,
u.`username` AS name,
DATE_FORMAT(`date`,'%d.%m.%Y, %H:%i') AS shortdate, 
TIMESTAMPDIFF(SECOND,`date`,NOW()) AS sec
FROM `messages` AS m 
LEFT JOIN `users` AS u 
ON u.`id` = m.`sid` 
WHERE `uid`='".$_SESSION['id']."' AND `uid_delete`='0' 
GROUP BY m.`sid`
ORDER BY m.`id` DESC");

Wenn ich hier das GROUP BY m.`sid` wegnehme, funkioniert es und er sortiert richtig, jedoch werden halt alle Mails einzelnd aufgelistet und das möchte ich eben nicht.

Wenn das GROUP BY drinbleibt, sortiert er jedoch falsch, dafür jedoch nach einzelne Benutzer.

Was kann ich da tun?
 
Ich denke für deinen Fall ist GROUP BY nicht das richtige. Denn wenn du nach der BenutzerID gruppierst, bekommst du ja pro Benutzer nur eine Nachricht angezeigt. Es fehlen auch bei deinem SELECT die Aggregatfunktionen http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

Ich denk am Besten ist es so (ohne GROUP BY):
SQL:
... ORDER BY m.`sid`, m.`id` DESC

Damit bekommst du die Liste nach Nutzer sortiert und innerhalb des Nutzer-Blocks nach der id der Nachricht.
Jetzt musst du in PHP das ganze dann so gruppieren, wie du es im HTML haben möchtest. Dafür läufst du alle Nachrichten durch und merkst dir jeweils die aktuelle Benutzer-ID. Sobald eine neue id auftaucht, beendest du den aktuellen block und fängst einen neuen an. Siehe auch http://www.tutorials.de/forum/relat...-datum-gruppieren-nach-uhrzeit-sortieren.html
 
Das ist ja auch mein Ziel, dass ich pro UserID eine Nachricht angezeigt bekomme (die aktuellste). Wenn man draufklickt wird nämlich der gesamte Verlauf angezeigt. Ich möchte nicht alle Nachrichten auflisten, da es dafür sowieso wie gesagt diese Extraseite als Nachrichtenverlauf gibt.

Ist es wirklich ratsam das in PHP zu machen?
 
Wie sollte ich das dann machen?

Alle User-IDs in einem Array in der while-Schleife speichern und immer prüfen, ob jeweilige User-ID im Array drin ist? Oder geht das anders/einfacher besser?
 
Wenn du lediglich die neueste will, müsste folgendes ausreichen

SQL:
SELECT MAX(m.`id`) AS message_id

und das gepaart mit

SQL:
GROUP BY m.`sid` ORDER BY MAX(m.`id`) DESC
 
Danke, das klappt schonmal ganz gut, jedoch wird immer eine Zufallsmail ausgegeben bzw. ausgewählt und nicht die aktuellste... versteh ich nicht so ganz.

Woran kann das liegen?
 
Poste bitte nochmal das komplette Query, welches du verwendet hast.
Eigentlich sollte die MAX()-Funktion genau das verhindern.
 
PHP:
$result = mysql_query("
SELECT MAX(m.`id`) AS message_id, m.`text`, m.`sid`, m.`status`,
u.`username` AS name,
DATE_FORMAT(`date`,'%d.%m.%Y, %H:%i') AS shortdate, 
TIMESTAMPDIFF(SECOND,`date`,NOW()) AS sec
FROM `messages` AS m 
LEFT JOIN `users` AS u 
ON u.`id` = m.`sid` 
WHERE `uid`='".$_SESSION['id']."' AND `uid_delete`='0' 
GROUP BY m.`sid`
ORDER BY MAX(m.`id`) DESC");

sid steht für SendID
uid steht für UserID
id für id der Mail
 
Ich habe es bei mir nochmal getestet. Also so ganz verstehe ich das auch nicht. Ich bekomme zwar die größte ID, aber nicht den dazu passenden text. Das heißt die Infos stammen aus unterschiedlichen Datensätzen.

Vielleicht kann uns das jemand anderes erklären.
 
Zuletzt bearbeitet:
Zurück