Получение самого последнего сообщения в цепочке

У меня есть запрос, который получает всю информацию, которая мне нужна для главной страницы системы обмена сообщениями (включая количество непрочитанных сообщений и т. Д.) ... но в настоящее время он извлекает исходный сообщение тем. Я хотел бы дополнить приведенный ниже запрос, чтобы вместо этого получить самое недавнее сообщение в каждом потоке.

Этот запрос очень близок, однако мои посредственные навыки 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;
}

Заранее благодарим за любую помощь, которую вы можете предоставить!

РЕДАКТИРОВАТЬ: (База данных)

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
  • Возвращает самое новое сообщение от родителя или отвечает, если Есть некоторые (например, gmail)
12
задан RANGER 29 June 2011 в 18:33
поделиться