I have a simple table maintaining messages between users. The table structure looks like
sender receiver message sendtime
1 2
I take 30 mins to find the solution for this problem because I have thew same problem just take it simple
SELECT DISTINCT sent_by FROM messages WHERE sent_to = 1 UNION SELECT DISTINCT sent_to FROM messages WHERE sent_by = 1
To me it feels simpler to use an own ID based on the sender and receiver. No JOIN
and just one GROUP BY
needed:
SELECT sender, receiver, message, MAX(time)
FROM (
SELECT *,
CASE WHEN sender < receiver
THEN CONCAT(sender,'&', receiver)
ELSE CONCAT(receiver,'&', sender) END AS fromto
FROM data) AS a
GROUP BY fromto
SELECT data.* FROM
(SELECT MAX(sendtime) AS sendtime
FROM data
WHERE 1 IN (sender,receiver)
GROUP BY IF (1 = sender,receiver,sender)) AS latest
LEFT JOIN data ON latest.sendtime = data.sendtime AND 1 IN (data.sender, data.receiver)
GROUP BY IF (1 = data.sender,data.receiver,data.sender)
I recommend to use unique sequence id in your table to avoid external GROUP BY
.
If you have incrementing unique message_id
(i.e. bigger message_id
corresponds to later sendtime
), the query would be much simpler:
SELECT data.* FROM
(SELECT MAX(message_id) AS message_id
FROM data
WHERE 1 IN (sender,receiver)
GROUP BY IF (1 = sender,receiver,sender)) AS latest
LEFT JOIN data USING(message_id)
Try making message as the primary key and put sender and receiver in 2 separate tables for the same message like this:
Table 1: {message, sender, sendtime}
Table 2: {message, receiver, sendtime}
This will work out
$query = "SELECT * FROM tableName WHERE `sender`='$userNumber' OR `receiver`='$userNumber' ORDER BY `sendtime` DESC LIMIT 0,1";
Try this:
SELECT Distinct (*)
FROM tableName m
WHERE date =
(
SELECT MAX (date)
FROM tableName
)