0

私はテーブルを持っています:

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) 2 人のユーザー間のすべてのメッセージを選択し、私はこれを行いました:

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 と別のユーザーの間のメッセージのすべてのグループの最後のメッセージを選択します

-- どうすればこれができますか?

4

5 に答える 5

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);
于 2012-06-14T12:57:05.257 に答える
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));
于 2012-06-14T12:14:19.943 に答える
0

これは最初の部分です...括弧が必要ですか?

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

2 番目の部分は少し難しいかもしれませんが、これで正しい軌道に乗るはずです。

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
于 2012-06-14T13:03:19.643 に答える
0

これは、任意の 2 人のユーザー間のすべての最後のメッセージを返します。

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));
于 2012-06-14T12:49:55.277 に答える
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
于 2012-06-14T12:37:32.547 に答える