Jump to content
Omar~

Relacionar resultados na busca

Recommended Posts

Primeiro a situação porque é difícil de explicar:

Preciso realizar uma query em duas tabelas uma de pergunta (tabela_A) outra de resposta (tabela_B) usando o operador LIKE

Ambas possuem uma coluna para o conteúdo, a tabela_A possui também uma coluna para título.

A tabela_b é possui uma coluna para se relacionar com a tabela_A.

Então digamos que na tabela_A tenho a seguinte questão:

 

tabela_A

Título: João foi ao mercado?

Conteúdo (pergunta): Alguém sabe se ele comprou arroz?

tabela_B

Conteúdo (resposta): Eu vi que joão comprou feijão.

 

A consulta então seria pela palavra chave joão que poderia está presente nas 2 tabelas e em 3 colunas.

Tentei da seguinte forma montar a query:

SELECT
        tabela_A.id,
        tabela_A.titulo,
        tabela_A.pergunta,
        tabela_B.relacao,
        tabela_B.resposta
    FROM
        tabela_A
    INNER JOIN
        tabela_B
    ON
        tabela_A.id = tabela_B.relacao
    WHERE
        tabela_B.resposta LIKE '%joão%'
    OR (
        tabela_A.titulo LIKE '%joão%'
        OR
        tabela_A.pergunta LIKE '%joão%'
    )

Os problemas são se eu passar o comando ON para relacionar a resposta com a pergunta:

A query não retorna se não houver dados na tabela_B.

A query só retorna resultado se for buscado dados pela coluna resposta (mesmo existindo a palavra chave nas colunas citadas da tabela_A).

 

A questão é:

Como eu realizaria essa consulta?

Se a palavra chave for encontrado na coluna titulo, pergunta ou resposta, de forma a que eu irei listar a coluna_A.

Exemplo:

Pesquisou por Maria, no título não tem, na pegunta não tem, na resposta tem.

Pesquisou por Luiz, no título tem,  na pegunta não tem, na resposta não tem.

 

Ou seja em qualquer um dos campos de ambas colunas que houver a chave de consulta deve retornar dados da coluna_A, mesmo que seja uma resposta na coluna_B.

 

A forma que estou procedendo mesmo dando o resultado esperado não acho adequado acredito que uma query bastaria.

Consultar tabela_A pelos campos tilulo e pergunta.

Consultar tabela_B pelo campo resposta.

Usar a função no PHP array_merge para unir ambos resultados em um único array.

Remover os índices duplicados do array unificado.

Share this post


Link to post
Share on other sites

opa.. como os 2 lados podem não ter os dados,
a única forma de fazer em uma única query ai, é igualar as colunas e usar um UNION ALL das 2 queries.

 

se fosse null para apenas um lado, bastaria trocar o INNER por LEFT ou RIGHT, mas como pode ser null para qualquer um dos 2 lados, ai não tem muito o que fazer.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By janir.matheus
      Boa tarde, peço ajuda dos membros desse fórum pois confesso estar completamente perdido.
      Tomando como base o diagrama (em anexo), preciso de uma query que retorne as empresas, seus produtos e as categorias de cada produto, sendo que cada produto pode pertencer a uma ou mais categorias.
       
      select tbl_produtos.Empresa, tbl_empresas.Nome, tbl_catprod.Categoria, tbl_classproduto.Classe, tbl_produtos.Id, tbl_produtos.Produto from tbl_produtos inner join tbl_empresas on tbl_produtos.Empresa = tbl_empresas.Id left join tbl_catprod on tbl_produtos.Id = tbl_catprod.Categoria left join tbl_classproduto on tbl_catprod.Categoria = tbl_classproduto.Id; Tentei a consulta mostrada acima mas o resultado não foi o que eu esperava.
      Agradeço antecipadamente pela ajuda.

    • By Rogério Orlando
      Na SQL abaixo, quando consulto as tabelas, os registros se repetem, apresentando mais do que realmente existem.
      Alguém pode auxiliar no que está errado ou o que falta para que a select retorne apenas um registro para cada documento?
      Esclareço que todas as tabelas tem um campo "documento", porém ele não é chave e no retorno trouxe todos os campos de todas as tabelas e não apenas as dá SQL:
       
       
      select so01.documento,so01.digito,so01.nome,so01.regional,so01.situacao,so01.observacao,so01.n_spprev,so01.averbacao, so02.endereco, so02.numero, so02.bairro,so02.cidade,so02.cep,so02.estado,so02.aniversario, so03.rg, so03.cpf, so03.email, so04.estado_civil, so04.agencia,so04.dg_agencia,so04.conta,so04.dg_conta,so04.banco,so04.ddd,so04.telefone,so04.nascimento, so04.admissao,so04.demissao_seg,so04.admor,so04.ddd_cel,so04.celular from so03 inner join so01 ON so01.documento= so03.documento inner join so02 ON so02.documento= so03.documento inner join so04 ON so04.documento=so03.documento where so01.documento="68" and so01.digito="0"  
       
    • By Danado_
      como eu seleciono da seguinte forma: 
       
      tabela cadastro;
      id 1 - fulano
      id 2 - bertano
      id 3 - fulaninho
      ---------------------------------------
      Observações:
      estou usando um select multiple e dou um insert into na tabela a abaixo ficando assim:
      ----------------------------------------
      tabela mesas
      id 1 - fulano, bertano
      -----------------------------------------

      ok até ai!
       
      AGORA QUE PRECISO DA AJUDA DE VOCÊS!
      preciso fazer um inner, left ou righ para TRAZER APENAS O  id 3 - fulaninho (no caso verificando as duas tabelas e selecionando apenas o que NAO foi selecionado!)
       
      tenho isso:
       
      <select name="nome[]" multiple> <?php $mapa = mysqli_query($con, "SELECT * FROM cadastro'"); while($dados = mysqli_fetch_assoc($mapa)){ ?> <option><?php echo $dados['nome']; ?></option> <?php } ?> </select>
       
    • By lemanoel
      oi, sou novo por aqui! desculpe se a pergunta é muito simples.... tenho duas tabelas:
      TABELA: atendimento: cd_item data_atend nome_cliente TABELA: documento_clinico cd_doc cd_item data_doc  
      o tenho a relação 1 atendimento para muitos docs. Quero criar um código que diz o número do atendimento e a data do doc mais antigo (apenas 1).  todas as tentativas duplicam o nome do cliente
    • By mnunesd12
      Ola Pessoal, 
      Recentemente comecei a estudar banco de dados por conta própria, para isso estou utilizando o mysql e "brincando" com o banco de dados de uma locadora que vem de exemplo no mysql, chamado sikila.
      Eu queria saber como eu faço uma query para selecionar os todos os clientes que já alugaram o mesmo filme em momentos diferentes.
       
      Select fm.film_id, fm.title cus.customer_id, concat( cus.first_name, " ", cus.last_name) as Nome from film as fm inner join inventory as inv on fm.film_id = inv.film_id inner join rental as rt on inv.inventory_id = rt.inventory_id inner join customer as cus on rt.customer_id = cus.customer_id Where rt.customer_id = 49 and rt.customer_id = 127 Nessa query eu sei que os customers números 49 e 127, já alugaram o mesmo filme, porém, não sei por qual motivo, a query não resulta em nada.
      Caso necessitem de mais informações fiquem à vontade para solicitar.
      Obrigado pela ajuda
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.