Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Condições em WHERE utilizando OR não trás todos os resultados das condições inseridas.


leonardorocha

Pergunta

Olá colegas, boa tarde!

Estou trabalhando em uma consulta via php consultando mysql e não funciona 100%. A consulta tem o WHERE da seguinte forma:

 WHERE (ad.id = '$idDirigente' AND ac.title LIKE '%$buscaAgenda%') OR (ad.id = '$idDirigente' AND ac.data_inicial = '$dataI')

Ou seja, quero que traga os registros de (ad.id) e (ac.title) se houver estes dados ou traga o (ad.id) e (ac.data_inicial). Porém no resultado eu consigo filtrar a consulta antes do "OR" de boa, porém após ele não vem nada e não gera erros. Tem algo errado nesta condição?

O meu if está da seguinte forma:  if(isset($dataI) || isset($buscaAgenda))

Qualquer dica para resolver vai ajudar muito.
Abraços a todos.

 

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0
2 horas atrás, Denis Courcy disse:

A condição where está recebendo todos estes parâmetros $idDirigente, $buscaAgenda e $dataI ao mesmo tempo?

Olá Denys, o parâmetro $dataI e $idDirigente é enviado incodicionalmente mas o $buscaAgenda é opcional. Ou seja, tenho 2 parâmetros de busca que seria por $dataI e $buscaAgenda, então a consulta por $dataI independente do parâmetro $buscaAgenda e vice-versa.

Editado por leonardorocha
Link para o comentário
Compartilhar em outros sites

  • 0

Se alguém puder ajudar vou postar aqui a consulta completa, alterei o modo de chamar os parâmetros, porém nem assim funciona. O que tá funcionando nesta consulta é somente o parâmetro buscaAgenda. Preciso que os dois funcionem sem um depender do outro.

      SELECT *,  ad.id, ad.name, car.id, ad.cargo_id, ac.title, ac.data_inicial
      from site_agendadirigentes_dirigentes as ad
      inner join site_agendadirigentes_dirigentes_compromissos as dc on ad.id = dc.dirigente_id
      inner join site_agendadirigentes_compromissos as ac on ac.id = dc.compromisso_id
      inner join site_agendadirigentes_cargos as car on car.id = ad.cargo_id
      where (ac.data_inicial = '$dataI'  or (ac.title like '%$buscaAgenda%'))
      and ad.id = '$idDirigente'

 

Editado por leonardorocha
inserir código corretamente.
Link para o comentário
Compartilhar em outros sites

  • 0

Leonardo, bom dia!

Sim, o formato está correto. Tanto é que se deixar para pesquisar apenas via data (dataI) a consulta funciona sem erros. O que está realmente acontecendo é que parece que a instrução OR não funciona. Pois se isolo as variáveis elas funcionam perfeitamente. Da mesma forma como dito antes dá certo com a busca por nome (buscaAgenda).

 

12 minutos atrás, leonardorocha disse:

Leonardo, bom dia!

Sim, o formato está correto. Tanto é que se deixar para pesquisar apenas via data (dataI) a consulta funciona sem erros. O que está realmente acontecendo é que parece que a instrução OR não funciona. Pois se isolo as variáveis elas funcionam perfeitamente. Da mesma forma como dito antes dá certo com a busca por nome (buscaAgenda).

 

Leonardo um exemplo é este aqui:

      WHERE ac.data_inicial = '$dataI'
      OR (ac.title LIKE '%$buscaAgenda%')
      AND ad.id = '$idDirigente'

O que pode está errado, pois só consigo filtrar o que vem após "OR" - $buscaAgenda, enquanto a $dataI não consigo filtrar, somente se ele estiver sozinho, ou seja, sem "OR".

Link para o comentário
Compartilhar em outros sites

  • 0

Ahhh agora entendi, o problema é o OR.

Do jeito que você está fazendo quando a data e a busca são pesquisadas ele pega os registros que tenham a data_inicial = $datal OU que title contenha $buscaAgenda. Isso significa que ele SOMA os dois conjuntos.

O que você quer é que ele retorne os registros com data_inicial = $datal E que title contenha $buscaAgenda. Isso REDUZ o conjunto comparando os dois ao mesmo tempo.

Solução: Na verdade você tem três tipos de consultas para fazer no Banco:

1- Com as duas variáveis:
where ac.data_inicial = '$dataI'  and ac.title like '%$buscaAgenda%' and ad.id = '$idDirigente'

2- Pesquisando só por data:
where ac.data_inicial = '$dataI'  and ad.id = '$idDirigente'

3- Pesquisando só por title
where ac.title like '%$buscaAgenda%' and ad.id = '$idDirigente'

Quem define qual deles você usar é o PHP usando IFs

Editado por Leonardo Persan
Link para o comentário
Compartilhar em outros sites

  • 0

Da pra fazer assim:

<?php
//Resto do código
$consulta = "SELECT ... WHERE ac.data_inicial = '$dataI' AND ad.id = '$idDirigente'"; //Todo a consulta que é obrigatória
if (!empty($buscaAgenda)) {
  $consulta .= " AND ac.title LIKE '%$buscaAgenda%'";
}
if (!empty($outraVariavel)) {
  $consulta .= " AND ac.outra_variavel = '$outraVariavel'";
}
$consulta .= "ORDER BY ... LIMIT ..."; //Resto da consulta se for o caso

Carda variável que é opcional entra em um IF

Editado por Leonardo Persan
Link para o comentário
Compartilhar em outros sites

  • 0
45 minutos atrás, Leonardo Persan disse:

Da pra fazer assim:


<?php
//Resto do código
$consulta = "SELECT ... WHERE ac.data_inicial = '$dataI' AND ad.id = '$idDirigente'"; //Todo a consulta que é obrigatória
if (!empty($buscaAgenda)) {
  $consulta .= " AND ac.title LIKE '%$buscaAgenda%'";
}
if (!empty($outraVariavel)) {
  $consulta .= " AND ac.outra_variavel = '$outraVariavel'";
}
$consulta .= "ORDER BY ... LIMIT ..."; //Resto da consulta se for o caso

Carda variável que é opcional entra em um IF

Excelente Leonardo.

Deu tudo certo aqui. Muito obrigado pela paciência e pela multiplicação do seu conhecimento.

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...