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

Creazione di un elenco di messaggi in SQL

Penso che la tua query stia producendo i risultati "giusti", come se volessi vedere l'ultimo messaggio in alcune conversazioni, dovresti davvero raggruppare per conversation_id . Tuttavia, non vedo questo campo nello schema.

Se fai WHERE sender_id = 3 GROUP BY receiver_id , allora è corretto, quella query ti restituisce i messaggi 1 e 7, perché quei messaggi erano stati inviati a diversi persone, quindi nel tuo design sono conversazioni diverse.

Se vuoi vedere solo l'ultimo messaggio inviato da te in generale, rimuovi semplicemente GROUP BY nella seconda parte del tuo UNION . In caso contrario, valuta la possibilità di riprogettare il tuo schema.

MODIFICA:

Prova questa query:

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)
    );

Alcune note:

  1. UNION non è più necessario;
  2. Questo approccio tratterà tutte le e-mail tra 2 parti come un'unica conversazione, il che non è sempre vero. Potresti voler riprogettare questo approccio;
  3. È un cattivo stile usare parole riservate (come date ) per i nomi o gli alias delle colonne, cerca di evitarlo. Oppure usa i backtick se li usi.