Вопрос

В настоящее время у меня есть следующие таблицы для личного форума обмена сообщениями:

альтернативный текст http://img159.imageshack.us/img159/45/pmdata.jpg

альтернативный текст http://img504.yfrog.com/img504/3968/pminfo.jpg

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

То, что у меня есть прямо сейчас, отлично работает для простых сообщений между 2 пользователями.Однако, как только третий пользователь отвечает на тот же поток, он отображается некорректно.Мой текущий запрос заключается в следующем:

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
INNER JOIN (SELECT thread_id, sender_id, MAX(date_sent) AS thread_max_date_sent FROM pm_data GROUP BY thread_id, sender_id) deriv1 ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent AND pm_data.sender_id = deriv1.sender_id
WHERE pm_info.receiver_id = '$usrID'
ORDER BY deriv1.thread_max_date_sent DESC

Предполагая, что $usrID = 68 (следовательно, receiver_id = 68), он выводит следующее:

From: Kyle (pm_data.id = 18) RE: single message (thread_id= 13587)
From: Ed (pm_data.id = 12)   RE: single message (thread_id= 13587)
From: Ed (pm_data.id = 8)    RE: Test Number 2 (thread_id= 16256)

Обратите внимание, что thread_id (13587) отображается дважды, потому что есть 2 разных отправителя.

Как я мог заполучить это просто отображать самый последний thread_id, независимо от того, кто отправитель?

Большое спасибо!!

Это было полезно?

Решение

На самом деле кажется, что запрос в исходном вопросе требует лишь очень небольшого изменения для получения самой последней записи для каждого потока. <Ол>

  • удалите sender_id в полях GROUP BY подзапроса
  • удалите pm_data.sender_id = производный1.sender_id в предложении ON
  • SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent
    FROM pm_info
    INNER JOIN pm_data ON pm_info.message_id = pm_data.id
    INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
    INNER JOIN (SELECT thread_id, /*sender_id,*/ MAX(date_sent) AS thread_max_date_sent 
                    FROM pm_data GROUP BY thread_id /*, sender_id*/) deriv1 
        ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent /*AND pm_data.sender_id = deriv1.sender_id*/
    WHERE pm_info.receiver_id = '$usrID'
    ORDER BY deriv1.thread_max_date_sent DESC
    

    В качестве примечания: по возможности ищите максимальное значение messageID в этом подзапросе вместо max (date_sent)

    Другие советы

    Попробуй

    SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid
    FROM pm_data, pm_info, tblUsers as sender 
    WHERE pm_info.message_id = pm_data.id 
      AND pm_data.sender_id = sender.usrID
      AND pm_info.receiver_id = '$usrID'
    GROUP BY thread_id
    ORDER BY date_sent DESC
    LIMIT 0,1
    

    Попробуй

    SELECT pm_info.is_read, group_concat(DISTINCT sender.usrFirst) as sender_name,
        pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid,
        MAX(date_sent) AS thread_max_date_sent
    FROM pm_info
    INNER JOIN pm_data ON pm_info.message_id = pm_data.id
    INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
    WHERE pm_info.receiver_id = '$usrID'
    GROUP BY pm_data.thread_id
    ORDER BY thread_max_date_sent DESC;
    

    Не стесняйтесь не соглашаться с частью group_concat, если она не соответствует вашим потребностям;в нем просто перечислены все соответствующие отправители, вместо того чтобы выбирать одного произвольно.

    Я бы предложил разделить вашу базу данных на две таблицы для лучшей нормализации: " thread " и "сообщение". Существует информация о потоках, которая будет общей для всех сообщений, например, заголовок темы. Вы тратите место в таблице сообщений, повторяя те же значения.

    Вы можете иметь " время последней публикации " поле таблицы тем, которая обновляется при каждом новом сообщении. Тогда достаточно просто выбрать из таблицы тем и упорядочить по последнему сообщению. Это тоже будет намного быстрее.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top