2017-02-15 21 views
0

は、これが私のテーブル構造である:私は(特定のユーザーのための)各会話について(日時に基づいて)最新のエントリを取得したいSQLクエリ/最新のエントリを取得

[id] [senderid] [recipientid] [message] [datetime] 

、結果がでなければなりません(自分のユーザーID 1):

435 | 1 | 67 | how are u? | timestampnow 

次の結果(レスポンス後):

436 | 67 | 1 | fine thanks | timestamplater 

混乱して行う方法Q /正しく/結合してください。

SELECT a.[id], a.[senderid], a.[recipientid], a.[message], a.[datetime] 
FROM yourTable a 
    INNER JOIN (SELECT recipientid, MAX(date) mdate 
       FROM yourTable 
       GROUP BY recipientid) b ON b.recipientid = a.recipientid 
             AND a.datetime = b.mdate; 
+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

答えて

0
select m.* 
from (
    select max(id) as id from (
     select max(id) as id, recipientid as user_id 
     from messages 
     where senderid = ? 
     group by recipientid 
     union all 
     select max(id) as id, senderid as user_id 
     from messages 
     where recipientid = ? 
     group by senderid 
    ) sub 
    group by user_id 
) sub 
join messages m using(id) 

最も内側のサブクエリは、会話ごとに2つのid S(最後に受信したメッセージから最後の送信されたメッセージからidid)まで戻ります。外部サブクエリは、2つのうちの最高のものを取得しますid s。結果はmessagesテーブルと結合され、対応する行が返されます。

(指定したユーザーIDと?を交換してください)

短く方法が考えられます。

select m.* 
from (
    select max(id) as id 
    from messages 
    where ? in (senderid, recipientid) 
    group by case when senderid = ? then recipientid else senderid end 
) sub 
join messages m using(id) 

しかし、その一つが遅くなる場合があります。

0

Firts条件でクエリを構築:私はsomethinkなどを試してみました

それはそれと同じくらい簡単かもしれません:

SELECT id, senderid, recipientid, message, MAX(datetime) as datetime 
FROM yourTable 
GROUP BY recipientid; 
0

あなたが選択したサブを必要としません:

SELECT recipientid, MAX(date) mdate 
FROM yourTable 
GROUP BY recipientid 

サブクエリとして使用することを:

SELECT * FROM messages MSG 

INNER JOIN 
(SELECT MAX(id) MAXDATE,recipientid,senderid 
FROM messages 
GROUP BY recipientid,senderid) MSG2 

ON MSG.recipientid = MSG2.recipientid 
AND MSG.id = MAXDATE 
+0

私は間違いなくそれほど単純ではありません。 –

+0

右、私の悪い - 見落として "会話"は双方向、 それはかなりとにかく –

関連する問題