phpMyAdmin
 sql >> Base de Dados >  >> Database Tools >> phpMyAdmin

Criando uma lista de mensagens no SQL


Acho que sua consulta está produzindo os resultados “certos”, como se você quisesse ver a última mensagem em algumas das conversas, você deveria agrupar pelo conversation_id . Eu não vejo este campo você no esquema embora.

Se você fizer WHERE sender_id = 3 GROUP BY receiver_id , então está correto, essa consulta retorna as mensagens 1 e 7, porque essas mensagens foram enviadas para diferentes pessoas, portanto no seu design são conversas diferentes.

Se você quiser ver apenas a última mensagem enviada por você em geral, basta remover GROUP BY na segunda parte do seu UNION . Caso contrário, considere reprojetar seu esquema.

EDITAR:

Tente esta consulta:
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)
    );

Algumas notas:
  1. UNION não é mais necessário;
  2. Essa abordagem tratará todos os e-mails entre duas partes como uma única conversa, o que nem sempre é verdade. Você pode querer redesenhar essa abordagem;
  3. É um estilo ruim usar palavras reservadas (como date ) para nomes ou aliases de colunas, tente evitar isso. Ou use acentos graves se você os usar.