Вы можете использовать CTE для составления списка максимальных дат данного пользователя в каждом контексте, затем JOIN
для таблиц conversation
, context
и user
для получения сведений о последних разговоры в каждом контексте. Например, для пользователя 2
:
WITH usernum AS (
SELECT '2' AS user
),
max_user_date AS (
SELECT DISTINCT c.context, u.user, MAX(c.`Date`) OVER (PARTITION BY context, user) AS max_date
FROM conversation c
JOIN usernum u ON c.Sender = u.user OR c.Receiver = u.user
)
SELECT m.max_date as `Date`,
cx.title AS title,
cv.Message AS message,
CONCAT(u1.Name, ' ', u1.`Last Name`) AS Sender,
CONCAT(u2.Name, ' ', u2.`Last Name`) AS Receiver
FROM max_user_date m
JOIN conversation cv ON (cv.Sender = m.user OR cv.Receiver = m.user)
AND cv.context = m.context
AND cv.Date = m.max_date
JOIN context cx ON cx.id = cv.Context
JOIN user u1 ON u1.User = cv.Sender
JOIN user u2 ON u2.User = cv.Receiver
ORDER BY `Date`, cx.id
Вывод:
Date title message Sender Receiver
2019-01-27 Fault in our stars What colored hat ? Jack Daniels Jane Dow
2019-01-27 Fault in our stars Do you code? Jane Dow Tony Stark
2019-01-28 I have a blue car Do you use my sql Jane Dow John Doe
2019-01-29 Where do you stay color of your car. John Doe Jane Dow
2019-01-31 Lets talk about javascript favourite key ? Jane Dow John Doe
2019-01-31 How do you do There you are Peter Parker Jane Dow
Демонстрация по dbfiddle
Если у вас есть версия БД который не поддерживает CTE и оконные функции, вы можете написать CTE как подзапрос:
SELECT m.max_date as `Date`,
cx.title AS title,
cv.Message AS message,
CONCAT(u1.Name, ' ', u1.`Last Name`) AS Sender,
CONCAT(u2.Name, ' ', u2.`Last Name`) AS Receiver
FROM (
SELECT c.context, '2' AS user, MAX(c.`Date`) AS max_date
FROM conversation c
WHERE c.Sender = '2' OR c.Receiver = '2'
GROUP BY c.context
) m
JOIN conversation cv ON (cv.Sender = m.user OR cv.Receiver = m.user)
AND cv.context = m.context
AND cv.Date = m.max_date
JOIN context cx ON cx.id = cv.Context
JOIN user u1 ON u1.User = cv.Sender
JOIN user u2 ON u2.User = cv.Receiver
ORDER BY `Date`, cx.id
Вывод такой же, как в первом запросе. Демо на dbfiddle