Estou realmente lutando para entender como escrever uma consulta. Existem duas tabelas principais para um recurso de chat. A UserConversation
tabela contém os IDs do remetente e do destinatário para um bate-papo bidirecional. A UserMessage
tabela contém as mensagens correspondentes. As tabelas User
e UserProfile
são necessárias apenas para extrair alguns detalhes extras. Aqui está a estrutura da tabela:
Conversa de usuário
Eu ia | ID do remetente | SenderDeleteDate | ID do destinatário | RecipientDeleteDate | Criar Data |
---|---|---|---|---|---|
1 | 1002 | NULO | 1001 | NULO | 23/12/2023 14:14:13.1152723 +07:00 |
2 | 1001 | NULO | 1003 | NULO | 23/12/2023 14:15:20.1264302 +07:00 |
3 | 1001 | NULO | 1004 | NULO | 23/12/2023 14:16:57.4302621 +07:00 |
Do utilizador
Eu ia | Nome de usuário |
---|---|
1001 | JohnDoe |
1002 | Curvar |
1003 | JakeSmith |
1004 | KrisKringle |
Perfil de usuário
ID do usuário | avatar |
---|---|
1001 | avatar/imagem/1001.jpg |
1002 | avatar/imagem/1002.jpg |
1003 | avatar/imagem/1003.jpg |
1004 | avatar/imagem/1004.jpg |
Mensagem do usuário
ID de conversa | ID do remetente | ID do destinatário | Mensagem lida | Mensagem | Criar Data |
---|---|---|---|---|---|
1 | 1002 | 1001 | 0 | Olá | 22/12/2023 13:00:00 |
1 | 1001 | 1002 | 0 | Olá | 22/12/2023 13:30:00 |
2 | 1001 | 1003 | 1 | Feliz Natal | 22/12/2023 14:00:00 |
2 | 1003 | 1001 | 1 | O mesmo para você | 22/12/2023 14:30:00 |
3 | 1001 | 1004 | 1 | Pegue algumas cervejas? | 22/12/2023 15:00:00 |
3 | 1004 | 1001 | 0 | Claro | 22/12/2023 15:30:00 |
Estou tentando obter o seguinte resultado:
ID de conversa | ID do usuário | Nome de usuário | UserAvatar | Última data | Contagem não lida |
---|---|---|---|---|---|
3 | 1004 | KrisKringle | avatar/imagem/1004.jpg | 22/12/2023 15:30:00 | 1 |
2 | 1003 | JakeSmith | avatar/imagem/1003.jpg | 22/12/2023 14:30:00 | 0 |
1 | 1002 | Curvar | avatar/imagem/1002.jpg | 22/12/2023 13:30:00 | 1 |
Algumas notas:
- Pesquise na
UserConversation
tabela as ocorrências ondeJohnDoe
está oSenderId
ouRecipientId
, mas quero retornar os dados do usuário do outro usuário. - Coluna de contagem
MessageRead
naUserMessages
tabela para cada conversa, mas apenas onde o usuário pesquisado (JohnDoe
) é o destinatário da mensagem. - Ordene os resultados pelos mais recentes
CreateDate
Não cheguei muito longe, aqui está o que tenho até agora.
select
uc.Id as Id,
us.Id as UserId,
us.UserName as Username,
ups.AvatarImage as UserAvatar
from UserConversation uc
join UserMessage um on uc.Id = um.ConversationId
join [User] us on uc.SenderId = us.Id
join [User] ur on uc.RecipientId = ur.Id
join UserProfile ups on us.Id = ups.UserId
join UserProfile upr on ur.Id = upr.UserId
where uc.SenderId = 1001 or uc.RecipientId = 1001
Como você deseja as linhas com JohnDoe como remetente ou destinatário junto com o outro participante, você deve unir as tabelas User e UserProfile duas vezes (uma para o remetente e outra para o destinatário). Feito isso, você pode fazer agregações e agrupamentos e algumas expressões case (ou função Decode() ou qualquer outra coisa semelhante) para obter os dados corretos para o resultado esperado. Não conheço t-sql, mas sua sintaxe é semelhante o suficiente ao sql da Oracle. Tenho certeza que você poderia adotar o código abaixo e transcrevê-lo para t-sql.
Oráculo: