Ir para conteúdo

POWERED BY:

Arquivado

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

Raphael Pontes

SQL select

Recommended Posts

Olá pessoal tenho uma tabela da seguinte forma:

 

CREATE TABLE `mensagem` (
`id_mensagem` int(11) NOT NULL AUTO_INCREMENT,
  `fk_usuario` int(11) DEFAULT NULL,
  `fk_instituicao` int(11) DEFAULT NULL,
  `fk_udestino` int(11) DEFAULT NULL,
  `fk_idestino` int(11) DEFAULT NULL,
  `descricao` varchar(500) NOT NULL,
  `data_mensagem` datetime DEFAULT NULL,
  PRIMARY KEY (`id_mensagem`),
  KEY `fk_umensagem_usuario1` (`fk_usuario`),
  KEY `fk_umensagem_usuario2` (`fk_udestino`),
  KEY `fk_mensagem_instituicao1` (`fk_instituicao`),
  KEY `fk_mensagem_instituicao2` (`fk_idestino`),
  CONSTRAINT `fk_mensagem_instituicao1` FOREIGN KEY (`fk_instituicao`) REFERENCES `instituicao` (`id_instituicao`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_mensagem_instituicao2` FOREIGN KEY (`fk_idestino`) REFERENCES `instituicao` (`id_instituicao`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_umensagem_usuario1` FOREIGN KEY (`fk_usuario`) REFERENCES `usuario` (`id_usuario`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_umensagem_usuario2` FOREIGN KEY (`fk_udestino`) REFERENCES `usuario` (`id_usuario`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

 

nela eu executo essa busca:

 

SELECT m.*,u.id_usuario as pk_remetente,
       u.nome as nome_remetente,
       u.url_foto as foto_remetente,
       u2.id_usuario as pk_destinatario,
       u2.nome as nome_destinatario,
       u2.url_foto as foto_destinatario
FROM mensagem m
inner join usuario u on (u.id_usuario = m.fk_usuario)
inner join usuario u2 on (u2.id_usuario = m.fk_udestino)
where 1=1  and fk_usuario = 1 or fk_udestino = 1
group by m.fk_usuario, m.fk_udestino
order by data_mensagem desc

e ela me retorna duas linhas:

 

onde o pk_destinatario é 2 -> na primeira linha

e o pk_remetente é 2 -> na segunda linha.

 

Existe alguma forma deu criar uma busca onde o pk_destinatário e o pk_remetente não se repetirem?

 

exemplo se o pk_remetente 2 ja aparecer na linha X, ele não irá mais aparecer em nenhuma linha ambos se referindo tanto para o pk_remetente quanto como sendo pk_destinatário ou vice-versa.

 

 

Peço a ajuda de vcs. Por favor!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vc pode fazer um subselect com MAX()

ou talvez um subslect com NOT IN ou NOT EXISTS

 

mas tem uma regra definida de qual registro deve aparecer ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim a regra é não repetir s ID´s nas colunas pk_remetente e pk_destinatario.

 

tem um registro assim:

 

pk_remetente | pk_destinatario
     
      1               2
      2               1
      2               1
      1               2 

Isso implica dizer que usuario 1 enviou mensagem para usuario 2, depois o 2 para o 1 e assim sucessivamente.

A pesquisa deveria retornar apenas o usuario 2, pois o usuario 1 seria eu.

e se houvesse por exemplo um outro usuario o 3, a pesquisa retornaria 2 linhas, uma com a primeira mensagem q usuario 2 mandou e a outra com a primeira mensagem que o usuario 3 mandou.

 

Assim eu listaria apenas as conversas ativas do perfil do usuário, seria baseado no chat do facebook.

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.