У меня есть таблица messages
, которая структурирована примерно так:
from | to | date
-----------------------------------
1 | 3 | 2011-09-23 11:51:44
3 | 1 | 2011-09-23 11:56:29
3 | 2 | 2011-10-04 10:20:01
2 | 3 | 2011-10-05 07:48:00
Я хочу отобразить страницу сообщений на моем веб-сайте, очень похожую на страницу сообщений Facebook, которая показывает список людей.с которым у пользователя есть разговор.Независимо от глубины разговора, на странице показан каждый человек только один раз вместе с самым последним сообщением в этом разговоре с этим конкретным человеком, было ли оно отправлено или получено.
часть, которая вводит меня в заблуждение, - то, что самое последнее сообщение может быть или отправлено или получено, что означает, что идентификационный номер пользователя может быть или в столбце from
или to
.Я не уверен, как тестировать оба столбца так, как мне нужно.
Я все еще учусь писать более сложные запросы MySQL, и хотя мне кажется, что это простой случай использования OR
с подзапросами, я не могу понять это правильно.
РЕШЕНИЕ Оказывается, это был не совсем простой случай.Видору потребовалось некоторое время, чтобы помочь мне с этим, и следующий запрос, наконец, справился с этой задачей.Он не был тщательно протестирован, но пока работает нормально:
SELECT m.*
FROM messages m
JOIN (SELECT Max(x.id) AS `id`,
x.userid,
x.partnerid,
Max(x.mostrecent) AS `mostrecent`
FROM (SELECT Max(id) `id`,
`from` AS `userid`,
`to` AS `partnerid`,
Max(`created`) AS `mostrecent`
FROM messages
GROUP BY `from`,
`to`
UNION
SELECT Max(id) `id`,
`to` AS `userid`,
`from` AS `partnerid`,
Max(`created`) AS `mostrecent`
FROM messages
GROUP BY `to`,
`from`) AS `x`
GROUP BY x.`userid`,
x.`partnerid`) AS `y`
ON y.id = m.id
WHERE y.userid = $userid