Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rigoni

Selecionar última mensagem entre cada usuário

Recommended Posts

Pessoal, estou quebrando a cabeça pra fazer uma query que me retorne a última mensagem enviada/recebida entre dois usuários.

 

O único valor que eu teria pra passar pra query é o do id do usuário logado. Então preciso que me retorne a última mensagem que ele enviou ou recebeu para/de cada usuário (não ambas). Não importa se ele recebeu ou enviou, eu quero a última.

 

Tenho a seguinte tabela:

 

messages

id

id_user_from

id_user_to

body

created_at

 

Nela, tenho valores como:

 

[table messages]

[tr]

[td]id[/td] [td]id_user_from[/td] [td]id_user_to[/td] [td]body[/td] [td]created_at[/td]

[/tr]

[tr]

[td]1[/td] [td]1[/td] [td]2[/td] [td]mensagem teste[/td] [td]2014-02-10 14:00:00[/td]

[/tr]

[tr]

[td]2[/td] [td]1[/td] [td]2[/td] [td]mensagem teste[/td] [td]2014-02-11 14:00:00[/td]

[/tr]

[tr]

[td]3[/td] [td]2[/td] [td]1[/td] [td]mensagem teste[/td] [td]2014-02-12 14:00:00[/td]

[/tr]

[tr]

[td]4[/td] [td]2[/td] [td]1[/td] [td]mensagem teste[/td] [td]2014-02-13 14:00:00[/td]

[/tr]

[tr]

[td]5[/td] [td]1[/td] [td]2[/td] [td]mensagem teste[/td] [td]2014-02-14 14:00:00[/td]

[/tr]

[tr]

[td]6[/td] [td]3[/td] [td]1[/td] [td]mensagem teste[/td] [td]2014-02-15 14:00:00[/td]

[/tr]

[tr]

[td]7[/td] [td]3[/td] [td]1[/td] [td]mensagem teste[/td] [td]2014-02-16 14:00:00[/td]

[/tr]

[/table]

 

E preciso que a query me retorne os valores:

 

[table messages]

[tr]

[td]id[/td] [td]id_user_from[/td] [td]id_user_to[/td] [td]body[/td] [td]created_at[/td]

[/tr]

[tr]

[td]5[/td] [td]1[/td] [td]2[/td] [td]mensagem teste[/td] [td]2014-02-14 14:00:00[/td]

[/tr]

[tr]

[td]7[/td] [td]3[/td] [td]1[/td] [td]mensagem teste[/td] [td]2014-02-16 14:00:00[/td]

[/tr]

[/table]

 

Alguém pode me ajudar, por favor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom primeiramente, parabéns pelo tópico bem organizado...

 

A sua query poderia ser feita deste modo:

 

select (select b.body from messages b where b.id_user_to = a.id_user_to and b.created_at = max(a.created_at) group by b.id_user_to) from messages a
where a.id_user_from = 1
group by a.id_user_to;

 

Fiz um pequeno teste aqui e deu certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Roberto, obrigado pela resposta.

 

Consegui fazer do jeito q vc me disse, modificando algumas coisinhas... porém só consigo trazer um campo da tabela. Precisaria trazer todos eles.

 

Motta, não ajudou muito. Eu consigo trazer a data mais recente de um id, mas não é bem isso que quero. Quero trazer o que for mais recentes entre dois IDs, o user_to_id e o user_from_id.

 

Ah, e estou tentado fazer isso desde ontem, não pediria ajuda aqui se já não tivesse tentado muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode utilizar o row_number(), desta forma:

SELECT * FROM (SELECT id, id_user_from, id_user_to, body, created_at, row_number() OVER (PARTITION BY id_user_to ORDER BY created_at DESC) as RN  FROM messages ) WHERE RN <=1

 

Basicamente, o row_number() eu enumera os registros de acordo com o agrupamento (PARTITION BY id_user_to) e ordenado de forma decrescente (ORDER BY created_at DESC). Após enumerar, listei apenas o primeiro registro de cada agrupamento com o (WHERE RN <=1).

Eu testei no oracle então não sei se asintaxe para o MySQL está correta. Dê uma olhada neste (link) para saber mais sobre o row_number().

Espero ter ajudado, qualque dúvida pode postar !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não deu certo não.

 

Preciso informar na query de qual usuário quero as mensagens enviadas/recebidas (id_user_from, id_user_to).

 

E ele me retornou 2 linhas que não são nem as últimas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não daquela forma. Usando MAX ele vai pegar só a última conversa do usuário, quero q pegue a última q ele enviou ou recebeu de cada usuário...

 

To quebrando a cabeça aqui ainda... :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensou em fazer uma tabela virtual com um union , um select com o id_from e outro select com o id_to

O MAX seria nesta tabela virtual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.