SQL嵌套查询问题

时间:2012-10-05 14:18:11

标签: mysql sql

我有一个包含表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

谢谢!

2 个答案:

答案 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来查找对话中的最后一条记录。它然后加入以获取消息。