我有一个包含表MESSAGE的数据库,它包含我的所有消息。 我需要找到所有最后的对话消息。
该表包含以下字段: Id(int) 从(int) 到(int) 日期(日期) 消息(varchar)
我需要找一个返回所有最后消息的查询。 例如:
1 -> 3 : This is a first message; yesterday
3 -> 1 : This is the last one; today
1 -> 2 : Another message with 1 and 2; some time
3 -> 5 : Some message i don't need; some time
我需要找到:
"3 -> 1 : This is the last one; today"
"1 -> 2 : Another message with 1 and 2; some time"
我希望我的意思很清楚...... 我已经可以通过此查询找到与之对话的用户:
在此示例中,用户具有Id = 47
select distinct m.To from MESSAGE m Where m.From = 47 union select distinct m2.from From MESSAGE m2 where m2.To = 47
谢谢!
答案 0 :(得分:2)
男人,这真的很粗糙,看起来很丑陋,但我认为这是一个不错的起点......让用户进入“虚拟化”单表,获取其中一个/两个的最大消息日期,然后根据每个用户ID最大那些,并加入原始消息表。这至少是希望! :)请注意,“from”值几乎肯定是一个保留的SQL关键字,所以实际上它需要是fromID或类似的东西,但无论如何......有了这个警告......
* 编辑:测试过前面的例子,这不太正确,但是这个例子适用于每个SQLFiddle http://sqlfiddle.com/#!3/3f586/2
select distinct fromid, toid, message
from messages
join (select distinct max(msgDate) msgdate, userid from
(select max(messageDate) msgdate, fromID userid
from messages
group by fromID
union
select max(messageDate), toID userid
from messages
group by toID) as j group by userid ) as x
on (messages.fromID=x.userid
or messages.toID=x.userid)
and messages.messageDate=x.msgdate
答案 1 :(得分:2)
我认为这会做你想要的,假设id可用于定义“last message”:
select m.*
from message m join
(select least(from, to) as p1, greatest(from, to) as p2, max(id) as maxid
from message m
group by least(from, to), greatest(from, to)
) mmax
on m.id = mmax.maxid
这使用id来查找对话中的最后一条记录。它然后加入以获取消息。