MySQL частный / групповой запрос обмена сообщениями - получить последние сообщения разговора для пользователя - ОБНОВЛЕНО

Я боролся с (возможно) простым запросом SQL, для которого я не могу найти решение. Частью моего проекта является создание частной / групповой системы входящих / обмена сообщениями, в которой мне в настоящее время необходимо получить все разговоры и их сообщения - для всех разговоров, членом которых в настоящее время является запрашиваемый пользователь.

В настоящее время у меня есть следующая схема базы данных

users:
-------------------
userId int (PRIMARY KEY)
alias varchar(50)

pms:
-------------------
messageId int (PRIMARY KEY)
userId int (FK to users.userId)
message text
conversationId int (FK to pmConversations.conversationId)
timestamp

pmConversations:
-------------------
conversationId int (PRIMARY KEY)
title varchar(64)
timestamp
userId int (FK to users.userId)

pmMemberships:
-------------------
userId int (PK and FK together with conversationId)
conversationId (PK and FK together with userId)
role varchar(16)

Новое редактирование с обновленными - работающими (?) Запросами: в последнее время я пробовал разные вещи, и я пришел к следующим запросам, был бы очень рад, если бы кто-нибудь мог сообщить мне, если они очень плохие (чего я боюсь) они есть) - однако они на работу.

Для получения последнего сообщения + заголовка разговора + пользователя из каждого разговора, членом которого является пользователь, я использовал следующий запрос:

SELECT pmConversations.title convTitle, users.alias lastMsgFrom, pms.message lastMsg, pms.timestamp, pmMemberships.userId gettingForUser 
FROM users, pmConversations, pmMemberships, pms  
INNER JOIN ( SELECT MAX(pms.timestamp) AS latestPms, conversationId 
FROM pms GROUP BY conversationId ) sbq ON pms.timestamp=latestPms  
WHERE pmMemberships.conversationId=pmConversations.conversationId  
AND pms.conversationId=pmConversations.conversationId  
AND pmMemberships.userId=1 
AND users.userId=pms.userId;

И для получения всех сообщений от определенного разговора для определенного пользователя я использовал следующее:

SELECT pms.* 
FROM pms 
INNER JOIN pmMemberships 
ON pms.conversationId=pmMemberships.conversationId 
WHERE pmMemberships.userId = 2 
AND pms.conversationId = 2;

Если бы кто-нибудь намного более опытный, чем я, мог бы дать мне свой вклад в это, я был бы очень благодарен!

С уважением, Экен

0 ответов

Другие вопросы по тегам