0

私はテーブルを持っていますchat
列は"id", "sender", "message", "time", "sender_email". 次のように挿入されたいくつかのチャット履歴chat:

1 John hihi 10:45 john@email.com
2 John hihi 10:46 john@email.com
3 Peter hihi 10:47 peter@email.com
4 John hihi 10:48 john@email.com
5 John hihi 10:49 john@email.com
6 John hihi 10:50 john@email.com
7 Mary hihi 10:51 mary@email.com
8 John hihi 10:52 john@email.com
9 Peter hihi 10:53 peter@email.com
10 John hihi 10:54 john@email.com

表に出た人から最後のメッセージをもらいたいです。
テーブルに何度も登場する人がいる場合は、彼の最後のメッセージを取得してください。
したがって、取得したい結果は次のようになります。

10 John hihi 10:54 john@email.com
9 Peter hihi 10:53 peter@email.com
7 Mary hihi 10:51 mary@email.com

そうすることは可能ですか??
これまでのところ、SQLを書くだけです:

SELECT DISTINCT name from chat ORDER BY id DESC

しかし、私が望むものを表示できないようです。

4

2 に答える 2

4

どのメッセージが各ユーザーの最後のメッセージであるかを判断する必要があります (私はこれを行ってtimeいますが、より高い値が確実に後のメッセージと等しいことがわかっている場合は、それを行うこともできidます)、そのメッセージのデータを取得します。

SELECT chat.*
FROM chat
INNER JOIN
(
    SELECT MAX(time) AS time, sender
    FROM chat
    GROUP BY sender
) lastMsg ON chat.time = lastMsg.time AND chat.sender = lastMsg.sender

これも、 に同順位がないことを前提としていtimeます。これが可能な場合は、代わりに ID を使用する必要があります。

SELECT chat.*
FROM chat
INNER JOIN
(
    SELECT MAX(id) AS id
    FROM chat
    GROUP BY sender
) lastMsg ON chat.id = lastMsg.id
于 2012-09-10T04:53:19.507 に答える
0
SELECT id, sender, message, time, sender_email FROM
    (SELECT * FROM chat ORDER BY time DESC) AS temp 
GROUP BY sender ORDER BY id DESC
于 2012-09-10T05:43:08.960 に答える