Get the last message of a conversation (GROUP BY)

4

I have the following query:

SELECT 
    cp_mensagem.mensagem, 
    cp_mensagem.dh_envio, 
    cp_projeto.id as id_projeto, 
    cp_projeto.nome as nome_projeto, 
    cp_pessoa.id as id_freelancer, 
    cp_pessoa.nome as nome_freelancer 
FROM cp_mensagem 
    JOIN cp_projeto ON (cp_projeto.id = cp_mensagem.id_projeto) 
    JOIN cp_pessoa ON (cp_pessoa.id = cp_mensagem.id_freelancer) 
WHERE cp_pessoa.id = 6 AND cp_mensagem.dh_visualizacao is NULL AND cp_mensagem.id_tipo_remetente = 1 
ORDER BY cp_mensagem.dh_envio DESC

This query yields the following result:

mensagem    |   dh_envio                |   id_projeto  |   nome_projeto    |   id_freelancer   |   nome_freelancer
Olá...      |   2014-04-22 11:51:41     |   2           |   WebSite         |   6               |   José
Oi...       |   2014-04-19 00:00:00     |   2           |   WebSite         |   6               |   José

To not repeat the id_project and id_freelancer I use GROUP BY, like this:

SELECT 
        cp_mensagem.mensagem, 
        cp_mensagem.dh_envio, 
        cp_projeto.id as id_projeto, 
        cp_projeto.nome as nome_projeto, 
        cp_pessoa.id as id_freelancer, 
        cp_pessoa.nome as nome_freelancer 
    FROM cp_mensagem 
        JOIN cp_projeto ON (cp_projeto.id = cp_mensagem.id_projeto) 
        JOIN cp_pessoa ON (cp_pessoa.id = cp_mensagem.id_freelancer) 
    WHERE cp_pessoa.id = 6 AND cp_mensagem.dh_visualizacao is NULL AND cp_mensagem.id_tipo_remetente = 1 
GROUP BY cp_mensagem.id_projeto, cp_mensagem.id_freelancer
    ORDER BY cp_mensagem.dh_envio DESC

This query brings me the following result:

mensagem    |   dh_envio                |   id_projeto  |   nome_projeto    |   id_freelancer   |   nome_freelancer
Oi...       |   2014-04-19 00:00:00     |   2           |   WebSite         |   6               |   José

I am ordering through dh_envio, but it still brings me the message with the oldest date, how do I get the query to bring me the last message of the group (id_project / id_freelancer)?

    
asked by anonymous 25.04.2014 / 17:58

1 answer

1

I would make a inner join with a sub query :

Select a.*
From cp_mensagem a
Join ( SELECT id_projeto, id_freelancer, max(cp_mensagem.dh_envio) as dh_envio
    FROM cp_mensagem 
    WHERE id_pessoa = 6 
AND dh_visualizacao is NULL 
AND id_tipo_remetente = 1 
GROUP BY cp_mensagem.id_projeto, cp_mensagem.id_freelancer) b on a.id_projeto =b.id_projeto
And a.id_freelancer = b.id_freelancer
And a.dh_envio = b.dh_envio
And a.dh_visualizacao is NULL
    
27.04.2014 / 15:05