Rigoni 0 Denunciar post Postado Fevereiro 26, 2014 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
Roberto Fagundes 40 Denunciar post Postado Fevereiro 26, 2014 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
Motta 645 Denunciar post Postado Fevereiro 26, 2014 http://forum.imasters.com.br/topic/512214-selecionando-item-max/#entry2030107 Ou tente ... Compartilhar este post Link para o post Compartilhar em outros sites
Rigoni 0 Denunciar post Postado Fevereiro 26, 2014 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
LegolasDBA 0 Denunciar post Postado Fevereiro 26, 2014 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
Rigoni 0 Denunciar post Postado Fevereiro 26, 2014 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
Motta 645 Denunciar post Postado Fevereiro 27, 2014 Com MAX não rolou ?! Compartilhar este post Link para o post Compartilhar em outros sites
Rigoni 0 Denunciar post Postado Fevereiro 27, 2014 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
Roberto Fagundes 40 Denunciar post Postado Fevereiro 27, 2014 Em uma unica query isso não vai dar certo você terá que criar tabela temporaria... Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 27, 2014 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