Neueste Nachricht oben anordnen (nach time ordnen)

Fonex47

Mitglied
Guten Tag liebe Tutos,
ich habe vor das so hinzukriegen, das das die neuesten Nachrichten von den jeweiligen Usern nach Zeit geordnet werden. Wie in jedem Chat/Messenger es der fall ist.
Habe ein wenig rum probiert kriege es aber nicht hin. Die neueste Nachricht DIE NICHT geöffnet wurde wird oben angezeigt. Sobald ich sie öffne und jemand anderes schreibt, landet die andere Nachricht von der anderen person einfach irgendwo wieder unten.

Würde mich über eine Lösung freuen.

Danke

PHP:
   $private = $mysqli->query("
    SELECT count(*) as private_count, MAX(a.time) AS time, a.hunter, b.last_action, b.user_id, b.user_name, b.user_color, b.user_tumb, b.user_status, b.user_isverified from boom_private a inner join boom_users b on a.hunter = b.user_id 
    WHERE status = 0 AND target = {$data['user_id']} 
    GROUP BY hunter,user_id,user_name,user_color,user_tumb,last_action
    ORDER BY a.time DESC
");


PHP:
    $get_other = $mysqli->query("
        SELECT MAX(a.time) AS time, a.hunter, b.last_action, b.user_id, b.user_name, b.user_color, b.user_tumb, b.user_status, b.user_isverified FROM boom_private a
        INNER JOIN boom_users b ON a.hunter = b.user_id
        WHERE target = {$data['user_id']} AND status < 3 AND hunter != '{$data['user_id']}' $add_not
        GROUP BY hunter,user_id,user_name,user_color,user_tumb,last_action
        ORDER BY a.time DESC
    ");
 

Fonex47

Mitglied
Hat wirklich keiner eine Lösung ?
Die neueste Nachricht wird oben angezeigt ja aber nur wenn der empfänger die neueste Nachricht geschrieben hat und wenn ich jemand anderem eine neue Nachricht schreibe bleibt dieser Chat weiter unten, weil der jenige lange nichts mehr geschrieben hat, und so ist das im normalen fall eigentlich nicht richtig.

MfG
 

Zvoni

Erfahrenes Mitglied
Ein Bild sagt mehr als 1000 Worte?
Sorry, aber aus deiner Beschreibung werde ich nicht schlau
 

Fonex47

Mitglied
Unbenannt.png
Es wird nur nach der neuesten Nachricht von dem Gegenüber mir sortiert.
Das heißt wenn ich jemanden von ganz unten in meinen nachrichten etwas schreibe bleibt seine Nachricht unten.
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Jan, das ist es ja, was mich selbst auch stutzig gemacht hat, weshalb ich seine Fragestellung nicht verstehe.

Ein Chat ist in der Regel ein einfaches Multiline-Anzeige-Control, wo einfach neue Einträge oben/unten (nach Vorliebe) angehängt werden, und das Fenster ggfs. automatisch scrollen lässt
 

Fonex47

Mitglied
Jan, das ist es ja, was mich selbst auch stutzig gemacht hat, weshalb ich seine Fragestellung nicht verstehe.

Ein Chat ist in der Regel ein einfaches Multiline-Anzeige-Control, wo einfach neue Einträge oben/unten (nach Vorliebe) angehängt werden, und das Fenster ggfs. automatisch scrollen lässt
Nein es geht nicht um die Konversation selbst ich glaube ich habe es nicht richtig erklärt , es geht um den Postfach wo alle Nachrichten aufgelistet sind von verschiedenen Usern mit kleiner Vorschau der letzten Nachricht von den jeweiligen User.
40C3CABA-DDCD-4AD5-9A90-6644C2DA5795.jpeg
 

ComFreek

Mod | @comfreek
Moderator
Ich verstehe -- du möchtest in der Konversationsübersicht (dein Screenshot) die Konversationen nach Aktualität sortieren.

Unten ist ein roher Entwurf, wie das in SQL aussehen könnte.
Die Idee ist, dass du alle letzten Nachrichten vom aktuellen Nutzer (<user>) dir anguckst, und zwar diejenigen die gesendet hast, aber auch die, die du empfangen hast. Dann gruppierst du nach dem anderen Nutzer (other_party); das sind genau die Nutzer, die in der Übersicht dann auch angezeigt werden.
(Schließlich möchtest du, dass ein Chat höher positioniert wird, wenn entweder du eine neue Nachricht geschrieben hast oder aber auch eine empfangen hast.)

Beachte, dass ich nicht viel mit relationalen Datenbanken, geschweige denn Datenbanken für große IM-Dienste arbeite; der Vorschlag also sehr ineffizient und praxisfern sein kann.
SQL:
WITH ingoing_messages (msg_id, other_party, msg, sent_time) AS (
  SELECT msg_id, from, msg, sent_time FROM chat_message WHERE to = <user>
)
WITH outgoing_messages (msg_id, other_party, msg, sent_time) AS (
  SELECT msg_id, to, msg, sent_time FROM chat_message WHERE from = <user>
)
WITH messages AS (ingoing_messages UNION outgoing_messages)
WITH ranked_messages AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY other_party ORDER BY sent_time DESC) AS idx
  FROM messages
)

SELECT other_party, msg, sent_time
FROM messages
WHERE idx = 1
ORDER BY sent_time
LIMIT 10
wobei <user> die ID desjenigen Nutzers ist, der die Konversationsübersicht gerade geöffnet hat.
(Beachte, dass LIMIT kein SQL-Standard, sondern MySQL-Eigenheit ist, die du ggf. für dein RDBMS übersetzen musst.)

Siehe auch Retrieving the last record in each group - MySQL.

Ich habe PARTITION BY noch nie benutzt -- du müsstest obigen Code noch bisschen anpassen.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Das generelle Problem dieses Fadens sollte übrigens bekannt sein. Womöglich findest du im Internet Alternativlösungen -- wo dann hoffentlich auch mehr Augen draufgeguckt haben. Stichwörter wären vielleicht "database {(instant) messaging system|chat} {last x|recent threads|recent chats|recent}", wobei die Schreibweise {a|...|z} Alternativen ausdrückt.