Ir para conteúdo

POWERED BY:

Arquivado

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

guihh25

PHP + MYsql busca onde a = b e b = a retornar 1 só

Recommended Posts

Olá pessoal, gostaria de saber se é possível e, caso for, como fazer a seguinte busca:

 

Eu tenho uma tabela da seguinte maneira:

 

userid1 / userid2 / descricao

 

Joao / Maria / teste

Maria / Joao / teste1

Pedro / Maria / teste2

Maria/ Jose / teste2

 

Como eu faria para fazer um SELECT que retornaria apenas as linhas abaixo? Que seja considerado que Joao = Maria e Maria = Joao e considerando que eu teria apenas a $variavel Maria

 

Joao / Maria / teste

Pedro / Maria / teste2

Maria/ Jose / teste2

 

Como eu faria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tratar da solução, qual a finalidade? Qual o motivo do mapeamento possuir uma coluna com dois campos usuários?

 

Pergunto isso pois talvez a solução esteja no mapeamento e não na consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o que você quis dizer com João = Maria e Maria = João...

 

Mas olhando o resultado esperado, entendo que a consulta deveria apenas verificar se userid1 é igual a Maria ou userid2 é igual a Maria

SELECT campos FROM tabela WHERE userid1 = 'Maria' OR userid2 = 'Maria';

Complementando o que o Gabriel comentou, pense melhor na estrutura da tabela. O ideal seria usar IDs, nào strings nesse relacionamento. Leia sobre Formas Normais

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tratar da solução, qual a finalidade? Qual o motivo do mapeamento possuir uma coluna com dois campos usuários?

 

Pergunto isso pois talvez a solução esteja no mapeamento e não na consulta.

 

O sistema é o seguinte:

 

é uma tabela ai quando um usuario manda um texto para outro usuario ficaria

 

id1 / id 2 / texto

 

id_usuario_enviou / id_usuario_recebeu / texto

 

porém o que recebeu pode mandar texto também para esse usuário ai ficaria o inverso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o que você quis dizer com João = Maria e Maria = João...

 

Mas olhando o resultado esperado, entendo que a consulta deveria apenas verificar se userid1 é igual a Maria ou userid2 é igual a Maria

SELECT campos FROM tabela WHERE userid1 = 'Maria' OR userid2 = 'Maria';

Complementando o que o Gabriel comentou, pense melhor na estrutura da tabela. O ideal seria usar IDs, nào strings nesse relacionamento. Leia sobre Formas Normais

 

Ok vamos la. vou tentar explicar melhor.

 

Eu tenho a tabela userid1 / userid2 / texto

 

Considerando as seguintes entradas:

 

userid1 / userid2 / texto

 

1 2 teste

2 1 teste1

3 1 teste2

3 2 teste3

4 5 teste4

 

 

eu quero fazer um SELECT para onde contenha o id = 1 e o retorno dessa tabela para a funcao mysqli_num_rows seja = 2. Ou seja, ele vai agrupar os dois primeiros resultados. O agrupamento seria devido ao texto ser trocado entre as mesmas pessoas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria importante possuir a coluna de data de envio, para ordenar conforme o envio. Entretanto, eu utilizaria um from contendo um sub-select. Esse sub-select seria o union de ambas as consultas, remetente/destinatário.

 

Digamos que a conversa seja entre usuário 1 e usuário 2. Mas quem está visualizando é o usuário 1 (sim, o ponto de vista, de quem está lendo, é importante). Logo:

SELECT
    *
FROM
    (
        SELECT userid1 as remetente  , descricao , dataenvio FROM tabela WHERE userid1 = 1 AND userid2 = 2
        UNION
        SELECT userid1 as remetente  , descricao , dataenvio FROM tabela WHERE userid1 = 2 AND userid2 = 1
    )
ORDER BY
    dataenvio ASC

Essa seria a consulta mais básica obter as mensagens, quem enviou e quando, além de estarem ordenados. A ordenação é importante, pois o UNION irá retornar primeiro a consulta 1 e depois a 2. Eu não retorno o user2, pois será sempre o contrário do user1, o que seriam mais dados para a consulta.

 

Depois, estude o plano de execução e veja questões de performance.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria importante possuir a coluna de data de envio, para ordenar conforme o envio. Entretanto, eu utilizaria um from contendo um sub-select. Esse sub-select seria o union de ambas as consultas, remetente/destinatário.

 

Digamos que a conversa seja entre usuário 1 e usuário 2. Mas quem está visualizando é o usuário 1 (sim, o ponto de vista, de quem está lendo, é importante). Logo:

SELECT
    *
FROM
    (
        SELECT userid1 as remetente  , descricao , dataenvio FROM tabela WHERE userid1 = 1 AND userid2 = 2
        UNION
        SELECT userid1 as remetente  , descricao , dataenvio FROM tabela WHERE userid1 = 2 AND userid2 = 1
    )
ORDER BY
    dataenvio ASC

Essa seria a consulta mais básica obter as mensagens, quem enviou e quando, além de estarem ordenados. A ordenação é importante, pois o UNION irá retornar primeiro a consulta 1 e depois a 2. Eu não retorno o user2, pois será sempre o contrário do user1, o que seriam mais dados para a consulta.

 

Depois, estude o plano de execução e veja questões de performance.

 

Obrigado aos que tentaram ajudar. Consegui resolver apenas colocando um GROUP BY userid1,userid2 e fazendo com que não fosse possível ter o mesmo userid em posições diferente com um outro id.

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.