2013-10-14 5 views
0

мне нужно, чтобы получить новейшее сообщение, которое без ответа рассмотрим следующие таблицы:Получить последнее сообщение в разговоре в SQL

usermeta

userid metakey metavalue 
-----|------------|------- 
12 | "thekey" | true 
41 | "thekey" | true 

Сообщение

sender reciepent content  date 
-----|------------|--------------|----------------- 
12 | 0   | "lorem ipsum"|2013-08-12 21:20:31 
0 |12   | "lorem ipsum"|2013-08-12 20:20:31 
41 |50   | "lorem ipsum"|2013-08-12 18:20:31 
50 |41   | "lorem ipsum"|2013-08-12 19:20:31 

Теперь я хочу получить сообщений, которые были не ответил другим человеком разговора, и написаны пользователем, который имеет usermeta «thekey» = истинное

я пытался несколько думает, но никто не работал. Я хотел бы получить помощь. Извините, если я сделал некоторые вещи неправильно, это мой первый пост здесь.

ответ

0

trye это:

select t.sender,t.reciepent,m2.content 
from 
(
select 
sender,reciepent, 
(select count(*) from messages m where m.sender = sender and m.reciepent = reciepent) sent, 
(select count(*) from messages m where m.sender = reciepent and m.reciepent = sender) rec 
from messages m 
) t 
inner join messages m2 on t.sender = m2.sender and t.reciepent = m2.reciepent 
inner join usermeta u on u.userid = t.sender 
where t.sent>t.rec and m2.date = (select max(m3.date) from messages m3 where m3.sender = m2.sender and m3.reciepent = m2.reciepent) and u.metakey='thekey' 
+0

Зачем использовать счетчики? Я думаю, что подсчет не решает проблему, потому что может быть, что кто-то отправляет 10 сообщений без ответа. ? – user2875962

+0

Подсчет фраз заключается в поиске различий между общими отправленными сообщениями между двумя пользователями в обоих направлениях. Если общее количество отправленных больше общего, то есть сообщение без ответа. – Jonysuise

+0

О, нет, я неправильно понял. Я имел в виду, что последнее сообщение от a до b отправляется позже последнего сообщения от b до a. Так что я думаю, мне нужна какая-то группировка или так – user2875962

0

Если у вас есть какой-либо уникальный/первичный идентификатор, который хранит свой чат, чем для получения последнего сообщения, которое вы можете использовать функции MySQL называются: mysql_insert_id(); Это даст вам последний добавленный идентификатор сообщения и по идентификатору вы можете получить сообщение.

Спасибо.

0

Поскольку вы используете Wordpress, я предполагаю, что вы также используете MySQL. У меня нет базы данных MySQL, но я поставил этот запрос вместе с использованием T-SQL, который вы можете перевести на MySQL.

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

create table #tmpLastMsg (
    sender int, 
    reciepent int, 
    msgdate datetime 
) 

-- get the last message from each user in every conversation 
insert into #tmpLastMsg 
select sender, reciepent, MAX(msgdate) 
from Message 
group by sender, reciepent 

select m.* 
from Message as m 
inner join (
    select msg.* 
    from #tmpLastMsg as msg 
    left join #tmpLastMsg as rep -- this join tries to find if there was a reply 
     on msg.sender = rep.reciepent 
     and msg.reciepent = rep.sender 
     and rep.msgdate > msg.msgdate 
    inner join usermeta as um on msg.sender = um.userid 
    where rep.sender is null -- we want unreplied messages 
     and um.metakey = 'thekey' 
     and um.metavalue = 'true' 
) as t on m.sender = t.sender 
    and m.reciepent = t.reciepent 
    and m.msgdate = t.msgdate 
Смежные вопросы