phpMyAdmin
 sql >> Datenbank >  >> Database Tools >> phpMyAdmin

Erstellen einer Nachrichtenliste in SQL

Ich denke, Ihre Abfrage liefert die „richtigen“ Ergebnisse, denn wenn Sie die letzte Nachricht in einigen der Konversationen sehen möchten, sollten Sie wirklich nach der conversation_id gruppieren . Ich sehe dieses Feld aber nicht im Schema.

Wenn Sie WHERE sender_id = 3 GROUP BY receiver_id tun , dann ist es richtig, dass diese Abfrage Ihnen die Nachrichten 1 und 7 zurückgibt, da diese Nachrichten an anders gesendet wurden Personen, daher sind sie in Ihrem Design unterschiedliche Konversationen.

Wenn Sie generell nur die allerletzte von Ihnen gesendete Nachricht sehen möchten, entfernen Sie einfach GROUP BY im zweiten Teil Ihrer UNION . Ziehen Sie andernfalls in Betracht, Ihr Schema neu zu gestalten.

BEARBEITEN:

Probieren Sie diese Abfrage aus:

SELECT m.message_id, u.username, m.subject, m.message,
       m.status, UNIX_TIMESTAMP(m.date) as `date`
  FROM users u
  LEFT JOIN messages m ON m.sender_id = u.id
 WHERE m.message_id IN (
    SELECT max(message_id) 
      FROM messages
     WHERE receiver_id = 3 OR sender_id = 3
     GROUP BY least(sender_id,receiver_id), 
              greatest(sender_id,receiver_id)
    );

Einige Anmerkungen:

  1. UNION wird nicht mehr benötigt;
  2. Bei diesem Ansatz werden alle E-Mails zwischen zwei Parteien als eine einzige Konversation behandelt, was nicht immer der Fall ist. Vielleicht möchten Sie diesen Ansatz neu gestalten;
  3. Es ist ein schlechter Stil, reservierte Wörter zu verwenden (wie date ) für Spaltennamen oder Aliase, versuchen Sie dies zu vermeiden. Oder verwenden Sie Backticks, wenn Sie sie verwenden.