2014-12-22 1 views
1

У меня есть таблица, хранящие сообщения с телом, с ID, чтобы ID и дату и время он послал на:SQL групповых сообщений в резьбе и получить последнее сообщение

ID | From | To | SendDate | Body 
--------------------------------- 
1 10  20 [a date] blabla 
2 20  10 [a date] some text 
3 8  10 [a date] some more text 
4 10  2 [a date] text 

Я хотел бы, чтобы захватить все «тему» пользователя 10 , но группы, если они вместе, и только возвращает последнее сообщение (макс senddate)

Я не могу получить гораздо дальше, чем это:

select * from message where [to] = 10 or [From] = 10 order by senddate desc 

Это даст мне все Сообщ es user 10, поэтому он вернет точную таблицу выше, , но записи 1 и 2 принадлежат к одному и тому же «потоку» (запись 2 является ответом на запись 1), поэтому мне нужно сгруппировать их как-то вместе и только вернуть новую запись (запись 2).

Что я хочу:

ID | From | To | SendDate | Body 
--------------------------------- 
2 20  10 [a date] some text 
3 8  10 [a date] some more text 
4 10  2 [a date] text 

Как я могу это сделать?

+2

Как вы знаете * запись 2 является ответом на запись 1? Это может быть новое сообщение, а не ответ на первый. –

+0

Я хочу сгруппировать в разговоры, так что это всегда ответ или стартер беседы – PoeHaH

ответ

0

Если вы хотите сгруппировать все сообщения между пользователями 10 и 20 (не так ли?) ..., то вы можете «изменить порядок» своих полей «От» и «Кому», чтобы облегчить создание вашего выбора.

Это Возможное решение:

SELECT BOTTOM, TOP, MAX("SendDate") 
FROM 
    (SELECT CASE WHEN Message."To" < "From" THEN Message."To" 
       WHEN Message."To" > "From" THEN Message."From" END as Bottom, 
      CASE WHEN Message."To" > "From" THEN Message."To" 
       WHEN Message."To" < "From" THEN Message."From" END as Top, 
      Message."SendDate", 
      Message.Body 
    FROM 
     -- These sentences are only for simulate your TABLE 
     (select 2 as "ID", 10 as "From", 20 as "To", sysdate as "SendDate", 'Text' as  Body from dual 
     union 
     select 3 as "ID", 20 as "From", 10 as "To", sysdate+1 as "SendDate", 'Text' as Body from dual 
     union 
     select 4 as "ID", 8 as "From", 10 as "To", sysdate as "SendDate", 'Text' as Body from dual) Messages) 
GROUP BY BOTTOM, TOP; 
0

У меня была та же задача, и мой ответ таков,

SELECT ID, From, To, SendDate, Body 
FROM (
    SELECT With, MAX(SendDate) as LatestDate 
    FROM (
     SELECT 
      CASE WHEN message.From={{ id }} THEN message.To 
       WHEN message.To={{ id }} THEN message.From END AS With, 
      SendDate 
     FROM message 
     WHERE From={{ id }} OR To={{ id }} 
    ) 
    GROUP BY With 
) r 
INNER JOIN message m ON (r.With = m.From OR r.With = m.To) AND r.LatestDate = m.SendDate 
ORDER BY LatestDate DESC 

Дело в том, что он когда-то роняет {{ID}} информации в самом внутреннем подзапросе. Таким образом, он может быть сгруппирован по потокам. После этого он снова вызывает выбор для объединения данных, отличных от последней даты.

Проблема в том, что если в таблице есть одинаковые сообщения о отметках времени, будут выбраны два потока, хотя они представляют один и тот же поток. Я думаю, что это не будет проблемой в реальной ситуации, но лучше решить ее.

Я полагаю, что этот ответ не является совершенным, и был бы более эффективный способ решения этой проблемы. Скажите, пожалуйста, если кто-нибудь знает более элегантные ответы.

Смежные вопросы