У меня есть запрос, который получает всю информацию, которая мне нужна для главной страницы системы обмена сообщениями (включая непрочитанное количество сообщений и т.д.)... но в настоящее время она извлекает сообщение оригинальное. Я хотел бы увеличить запрос ниже, чтобы захватить наиболее недавнее сообщение в каждом потоке.
Этот запрос очень близок, однако мои посредственные навыки SQL не позволяют мне обернуть вещи...
$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;
}
Заранее благодарим за любую помощь, которую вы можете предоставить!
EDIT: (База данных)
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;
ИЗМЕНИТЬ 2: (Требования)
- Вернуть все родительские сообщения для конкретных
user_id
:$cms_user['id']
- Возвращает количество ответов для этого родительского сообщения:
num_replies
- Возвращает количество непрочитанных ответов для этого родительского сообщения:
unread_replies
- Возврат даты родительского сообщения или последнего ответа:
last_datetime
- Возвращает, находится ли сообщение в архиве:
message_archive
- Возвращает, было ли просмотрено сообщение:
message_viewed
- Возвращает все сообщения в формате DESC datetime
- Вернуть новый
message
из родителя или ответов, если есть (например, gmail)