sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

Crear una lista de mensajes en SQL

Creo que su consulta está produciendo los resultados "correctos", como si quisiera ver el último mensaje en algunas de las conversaciones, realmente debería agrupar por conversation_id . Sin embargo, no veo este campo en el esquema.

Si haces WHERE sender_id = 3 GROUP BY receiver_id , entonces es correcto, esa consulta le devuelve los mensajes 1 y 7, porque esos mensajes se habían enviado a diferente personas, por lo que en tu diseño son conversaciones diferentes.

Si desea ver solo el último mensaje enviado por usted en general, simplemente elimine GROUP BY en la segunda parte de tu UNION . De lo contrario, considere rediseñar su esquema.

EDITAR:

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

Algunas notas:

  1. UNION ya no es necesario;
  2. Este enfoque tratará todos los correos electrónicos entre 2 partes como una sola conversación, lo que no siempre es cierto. Es posible que desee rediseñar este enfoque;
  3. Es un mal estilo usar palabras reservadas (como date ) para nombres de columnas o alias, trate de evitar esto. O usa acentos graves si los usas.