2017-12-25 5 views
1

私のテーブルSELECT最後の受信者からの最後のメッセージ。 mysqlの

id|receiver|sender|content|time 
1 | 6 | 2 | a | 13:33 
2 | 4 | 3 | b | 13:35 
3 | 4 | 3 | c | 14:01 
4 | 5 | 3 | d | 14:03 
5 | 7 | 2 | e | 14:05 
6 | 4 | 3 | f | 14:07 

私の予想結果: -

id|receiver|sender|content|time 
6 | 4 | 3 | f | 14:07 
3 | 4 | 3 | c | 14:01 
2 | 4 | 3 | b | 13:35 

現在、私のアプローチ: -

SELECT * FROM `meassages` 
    WHERE `sender` = 3 AND `receiver` IN (
    SELECT `receiver` FROM `messages` ORDER BY `time` DESC LIMIT 1 
) ORDER BY `time` DESC 

私は私の方法よりも、この簡単な操作を行うための方法を願っています。私はそれが可能であることを知っている。しかし、私はベストを尽くしました。助けを求めて先進的に感謝します。

+0

あなたのクエリはうまくいきますが、 '='は 'in'よりも意味があります。 –

答えて

1

クエリは一見問題はありませんが、最後のメッセージはsender = 3でした。だから、それはサブクエリでwhereを持っている方が良いです:

SELECT m.* 
FROM messages m 
WHERE m.sender = 3 AND 
     m.receiver = (SELECT m2.receiver 
        FROM messages m2 
        WHERE m2.sender = m.sender 
        ORDER BY m2.time DESC 
        LIMIT 1 
        ) 
ORDER BY m.time DESC; 

=の代わりINを使用すると、サブクエリが1行を返すことを強調しています。また、テーブルのエイリアスと修飾された列名を追加しました。

0

は、代わりにこれを試してみてください:

SELECT m1.* 
FROM `meassages` AS m1 
INNER JOIN 
(
    SELECT receiver, MAX(time) AS LatestTime 
    FROM messages 
    group by receiver 
) AS m2 ON m1.receiver = m2.receiver 
     AND m1.`time` = m2.LatestTime 
WHERE m1.`sender` = 3; 

内側のクエリを、これが最後の受信機である必要があり、あなたに各受信機の最新の時間を与えるだろう。その後、この最新時刻に基づいてテーブルに再び参加すると、最新の時刻を除くすべての行が削除されます。

関連する問題