2

I have a table "messages" that you can see the following image: table messages

from this table my id as user is 2. Sometimes I am sender, sometimes I am receiver.

I need a query that returns only the last message I exchange from each user. No matter if I sent it, or I received it. I am not sure if I should use distinct here. I don't really know how to use it.

To be more understood, in the above table for example should return:

row with id=4 (the last message I had with user 4)
row with id=6 (the last message I had with user 1)
row with id=7 (the last message I had with user 3)
row with id=5 (the last message I had with user 7)
row with id=19 (the last message I had with user 15)

4

3 回答 3

0

以下应该做你想要的:

SELECT messages.*
FROM (
  SELECT receiver_id, sender_id, MAX(datetime) maxtime
  FROM messages
  WHERE receiver_id = 2
  OR sender_id = 2
  GROUP BY receiver_id, sender_id
) latest
LEFT JOIN messages
ON latest.receiver_id = messages.receiver_id
AND latest.sender_id = messages.sender_id
AND latest.maxtime = messages.datetime

演示

于 2013-07-22T14:57:46.700 回答
0

你可以试试:

<!-- language: lang-sql -->
SELECT * FROM messages WHERE sender_id = 2 OR receiver_id = 2 ORDER BY Id DESC LIMIT 1
于 2013-07-22T14:32:05.460 回答
0
SELECT * FROM messages
JOIN (
    SELECT MAX(id) AS id
    FROM messages
    WHERE 2 IN (receiver_id, sender_id) -- useless if the table really only contains messages between you and another person
    GROUP BY IF(receiver_id = 2, sender_id, receiver_id) -- GROUP BY either sender_id or receiver_id, depending on which end of the exchange you are (will perform very poorly)
) AS last_message USING (id)

对于 knittl 的评论,以上假设单调增加id(例如auto_increment列)。如果不是这种情况,那么您必须求助于像这样丑陋的东西:

SELECT * FROM messages
JOIN (
    SELECT MAX(datetime) AS datetime, IF(receiver_id = 2, sender_id, receiver_id) AS other_id
    FROM messages
    WHERE 2 IN (receiver_id, sender_id)
    GROUP BY other_id
) AS last_message ON
    last_message.datetime = messages.datetime
    AND last_message.other_id = IF(receiver_id = 2, sender_id, receiver_id) -- this line is superfluous if only one message may be sent or received within one given second
于 2013-07-22T14:34:47.630 回答