2012-06-14 55 views
0

我有一个表:SQLseleсt最后一条消息

CREATE TABLE `tMessages` (
`tMessages_id` bigint(20) NOT NULL AUTO_INCREMENT, 
`tUsers_sender_uid` bigint(20) NOT NULL, 
`tUsers_recipient_uid` bigint(20) NOT NULL, 
`tMessages_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`tMessages_text` varchar(2000) NOT NULL, 
PRIMARY KEY (`tMessages_id`), 
KEY `tUsers_sender_uid` (`tUsers_sender_uid`), 
KEY `tUsers_recipient_uid` (`tUsers_recipient_uid`), 
KEY `tUsers_uids` (`tUsers_sender_uid`,`tUsers_recipient_uid`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

我需要:

1)两个用户之间进行选择的所有邮件和我这样做:

SELECT * FROM `tMessages` FORCE INDEX (tUsers_uids) WHERE tUsers_sender_uid = 1 AND tUsers_recipient_uid=2 OR tUsers_sender_uid=2 AND tUsers_recipient_uid = 1 

- 是这是一个快速的方法?

2)选择的uid = 1和另一个用户

之间的消息ALL组最后一条消息 - 我怎样才能做到这一点?

+0

'这是快速的方法'不是问题,为什么后面有一个问号? –

+0

这是我的错误=) – IONIX

+0

@IONIX,你对此有更新吗?我们努力在这里帮助你。 –

回答

0

第一部分需要括号吗?

SELECT * FROM `tMessages` 
WHERE (tUsers_sender_uid = 1 AND tUsers_recipient_uid=2) 
OR (tUsers_sender_uid=2 AND tUsers_recipient_uid = 1) 

第二部分可能有点更具挑战性......但这应该让你走上正轨。

select coalesce(r.recipient, s.sender) OtherParty, 
    case when coalesce(r.`tMessages_id`,s.`tMessages_id`) > coalesce(s.`tMessages_id`,r.`tMessages_id`) 
     then coalesce(r.`tMessages_id`,s.`tMessages_id`) 
     else coalesce(s.`tMessages_id`,r.`tMessages_id`) 
    end messageid 
from 
    (select `tUsers_recipient_uid` recipient, max(`tMessages_id`) `tMessages_id` 
    from `tMessages` 
    where `tUsers_sender_uid` = 1 
    group by `tUsers_recipient_uid`) r 
full outer join (
    select `tUsers_sender_uid` sender, max(`tMessages_id`) `tMessages_id` 
    from `tMessages` 
    where `tUsers_recipient_uid`= 1 
    group by `tUsers_sender_uid`) s 
on r.recipient = s.sender 
0
SELECT m.* 
    FROM tMessages m 
    WHERE (tUsers_sender_uid = 1 AND tUsers_recipient_uid=2 OR tUsers_sender_uid=2 AND tUsers_recipient_uid = 1) 
    and tMessages_timestamp = (select max(tMessages_timestamp) 
           from tMessages 
           WHERE (tUsers_sender_uid = 1 AND tUsers_recipient_uid=2 OR tUsers_sender_uid=2 AND tUsers_recipient_uid = 1)); 
+0

它介于两个用户之间)。我需要'tUsers_sender_uid' = 1或'tUsers_recipient_uid' = 1的所有最后消息 – IONIX

0

试试这个

select top(1)* from tMessages WHERE (tUsers_sender_uid = 1 
AND tUsers_recipient_uid=2) OR (tUsers_sender_uid=2 AND 
tUsers_recipient_uid = 1) order by tMessages_timestamp desc 
0

这人会返回任何用户之间的所有最后的消息:

SELECT m.* 
    FROM tMessages m 
    where tMessages_timestamp = (select max(tMessages_timestamp) 
            from tMessages 
            WHERE (tUsers_sender_uid = m.tUsers_sender_uid AND tUsers_recipient_uid = m.tUsers_recipient_uid OR 
              tUsers_sender_uid = m.tUsers_recipient_uid AND tUsers_recipient_uid = m.tUsers_sender_uid)); 
0

这人会返回一个特定的用户之间的所有最后消息(即1)和任何其他用户:

SELECT m.* 
    FROM tMessages m 
    where m.tMessages_timestamp = (select max(tMessages_timestamp) 
            from tMessages 
            WHERE (tUsers_sender_uid = 1      AND tUsers_recipient_uid = m.tUsers_recipient_uid OR 
              tUsers_sender_uid = m.tUsers_recipient_uid AND tUsers_recipient_uid = 1)) 
     and (m.tUsers_sender_uid = 1 or m.tUsers_recipient_uid = 1); 
相关问题