Tengo una consulta que obtiene toda la información que necesito para la página principal de un sistema de mensajería (incluyendo recuento de mensajes no leídos, etc.) ... pero actualmente recupera el mensaje original. Me gustaría aumentar la consulta a continuación para obtener el mensaje más reciente en cada hilo.Obteniendo el mensaje más reciente en un hilo
Esta consulta está muy cerca, sin embargo mis conocimientos de SQL mediocres me están guardando de envolver las cosas ...
$messages = array();
$unread_messages_total = 0;
$messages_query = "
SELECT m.*
, COUNT(r.id) AS num_replies
, MAX(r.datetime) AS reply_datetime
, (m.archived NOT LIKE '%,".$cms_user['id'].",%') AS message_archive
, (m.viewed LIKE '%,".$cms_user['id'].",%') AS message_viewed
, SUM(r.viewed NOT LIKE '%,".$cms_user['id'].",%') AS unread_replies
, CASE
WHEN MAX(r.datetime) >= m.datetime THEN MAX(r.datetime)
ELSE m.datetime
END AS last_datetime
FROM directus_messages AS m
LEFT JOIN directus_messages as r ON m.id = r.reply
WHERE m.active = '1'
AND (m.to LIKE '%,".$cms_user['id'].",%' OR m.to = 'all' OR m.from = '".$cms_user['id']."')
GROUP BY m.id
HAVING m.reply = '0'
ORDER BY last_datetime DESC";
foreach($dbh->query($messages_query) as $row_messages){
$messages[] = $row_messages;
$unread_messages_total += (strpos($row_messages['archived'], ','.$cms_user['id'].',') === false && ((strpos($row_messages['viewed'], ','.$cms_user['id'].',') === false && $row_messages['unread_replies'] == NULL) || ($row_messages['unread_replies']>0 && $row_messages['unread_replies'] != NULL)))? 1 : 0;
}
Gracias de antemano por cualquier ayuda que puede proporcionar!
EDIT: (base de datos)
CREATE TABLE `cms_messages` (
`id` int(10) NOT NULL auto_increment,
`active` tinyint(1) NOT NULL default '1',
`subject` varchar(255) NOT NULL default '',
`message` text NOT NULL,
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
`reply` int(10) NOT NULL default '0',
`from` int(10) NOT NULL default '0',
`to` varchar(255) NOT NULL default '',
`viewed` varchar(255) NOT NULL default ',',
`archived` varchar(255) NOT NULL default ',',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
EDIT 2: (Requisitos)
- Volver todos los mensajes de los padres para una específica
user_id
:$cms_user['id']
- devolverá el número de respuestas que mensaje primario:
num_replies
- Devuelve el número de leídos respuestas para que el mensaje de los padres:
unread_replies
- devolver la fecha del mensaje padre o su respuesta más reciente:
last_datetime
- retorno si el mensaje está en el archivo:
message_archive
- retorno si el mensaje ha sido visto :
message_viewed
- Volver todos los mensajes en orden de fecha y hora DESC
- Volver
message
la más reciente, de los padres o respuestas si hay alguna (como gmail)
¿Puede adjuntar el esquema de la tabla? y las lógicas de cómo identificar el mensaje reciente. thanx – yoavmatchulsky
@yoavmatchulsky - Esquema añadido. Las filas son mensajes principales ('reply = 0') o respuestas (' reply = parent_id'). Me gustaría tener el mensaje principal si no hay respuestas, o la respuesta más reciente de lo contrario (última respuesta para ese ID de mensaje padre ordenado por fecha y hora DESC). ¿Tiene sentido? – RANGER
¿Tiene mensajes de anidación profundos? o solo un nivel? – yoavmatchulsky