Estoy trabajando en un sistema de mensajería con dos tablas y otra con la información de los usuarios.
Una conversación puede tener entre 2 o más usuarios. Cada conversación tiene un UID y todos los mensajes intercambiados entre los usuarios están etiquetados con ese UID de conversación.Consulta del sistema de mensajería para obtener los últimos mensajes, el número de mensajes no leídos y la matriz de usuarios en la conversación
Estas son las tablas:
conversation_list
: cada fila de esta tabla vincula el user_id
y la conversation_id
, sino que también contiene la última vez que el usuario ha visto la conversación.
`id` -> unique ID, autoincremented
`user_id` -> This contains the user associated with the conversation.
`conversation_id` -> This contains the UID of the conversation
`date_lastView` -> This field has the time that the user viewed the conversation last
conversation_messages
: cada fila de esta tabla contiene un mensaje
`id` -> unique ID, autoincremented
`user_id` -> This contains the user that sent the message.
`conversation_id` -> This contains the UID of the conversation
`date_created` -> This contains the time when the message was posted
`message` -> This contains the message
users
: cada fila de esta tabla contiene un usuario
`User_ID` -> UID of the user
`FirstName` -> This contains the first name of the user
`LastName` -> This contains the last name of the user
Ya tengo una consulta SQL para obtener el último mensaje de cada conversación. Aquí está:
SELECT *
FROM conversation_messages AS m
JOIN
(SELECT mx.conversation_id,
MAX(mx.date_created) AS MaxTime
FROM conversation_messages AS mx
GROUP BY mx.conversation_id) AS mx ON m.conversation_id = mx.conversation_id
AND m.date_created = mx.MaxTime
JOIN
(SELECT mu.conversation_id
FROM conversation_list AS mu
WHERE mu.user_id = :USER_ID_CONNECTED
GROUP BY mu.conversation_id) AS mux ON m.conversation_id = mux.conversation_id
JOIN conversation_list AS mu ON m.conversation_id = mu.conversation_id
GROUP BY mu.conversation_id
ORDER BY m.date_created DESC
Ahora me gustaría añadir a esta consulta en perfecta eficacia la capacidad de volver:
- El número de mensajes no leídos para cada conversación (recuento de todos los mensajes con el
date_creaded
grande luegodate_lastView
del usuario que inició sesión) - Una matriz que contiene el
User_ID
de cada usuario en cada conversación y ordenada por la última vez que publicó un mensaje en la conversación. - Con la misma idea que la última matriz pero con
FirstName
yLastName
del usuario.
Intenté algunas cosas pero no tuve éxito, así que ahora le pido a la comunidad SO su valiosa ayuda. .
Todos esto sólo puede conversaciones pantalla donde el usuario conectado participa en
Se le ayuda, he creado un SQLFiddle
Una pregunta bien escrito 1. – Ben
Otro +1 para el violín. – JStead