Query Mysql

MySQL

30/03/2016

Boa noite, gostaria de ajuda para realizar uma consulta.

Minha query:

$sql = mysql_query("SELECT * FROM coh_bradesco WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_itau WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_santander WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_pagseguro WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_caixa WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' ") or die(mysql_error());


porem ele retorna tudo, queria separar para mostrar somente ex. pago nas datas entre 12 15.
Fabiano

Fabiano

Curtidas 0

Respostas

Fabiano

Fabiano

30/03/2016

$b = $_REQUEST['busca'];
$b2 = $_REQUEST['busca2'];
$b3 = $_REQUEST['busca3'];


$sql = mysql_query("SELECT * FROM coh_bradesco WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_itau WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_santander WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_pagseguro WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' UNION SELECT * FROM coh_caixa WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' ") or die(mysql_error());


Código mais completo da consulta que preciso.

Agradeço a ajuda.
GOSTEI 0
Marcos P

Marcos P

30/03/2016

Fabiano,

Use a tag <Inserir Código> para colocar o código no post. <Inserir Citação> não serve para isso, pois não apresenta os recursos de formatação necessários.

Entendi que seu código é...

SELECT * FROM coh_bradesco WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' 
UNION 
SELECT * FROM coh_itau WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' 
UNION 
SELECT * FROM coh_santander WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' 
UNION 
SELECT * FROM coh_pagseguro WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' 
UNION 
SELECT * FROM coh_caixa WHERE status LIKE '%$b%' OR data_criacao BETWEEN '%$b2%' AND '%$b3%' 


Existe, nesse código, um problema no uso dos operadores lógicos, pois a precedência de OR e AND parece estar errada.

Tente assim e veja se fica mais perto do que você precisa...

SELECT * FROM coh_bradesco WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT * FROM coh_itau WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT * FROM coh_santander WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT * FROM coh_pagseguro WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT * FROM coh_caixa WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Bom dia Marcos,

Muito obrigado pela dica, vou fazer certo desta vez.

Fiz como você sugeriu porem retornou esta msg de erro.

Warning: mysql_num_rows() expects parameter 1 to be resource, string given in

Estava pensando se fazer com INNER JOIN não seria o mais correto, mas ainda estou engatinhando em banco de Dados, e como gosto muito estou na luta para aprender aos poucos. Estou escrevendo o seguinte código com ajuda de alguns artigos:

$sql = mysql_query("SELECT  b.data_criacao, b.cliente, b.valor, b.status, b.banco FROM coh_bradesco b INNER JOIN coh_caixa b USING (id) WHERE b.data_criacao LIKE '%$b%'");


estou com duvidas de como esticar este comando para todas as tabelas.
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Tentei fazer,

$sql = mysql_query("SELECT  b.data_criacao, b.cliente, b.valor, b.status, b.banco FROM coh_bradesco b INNER JOIN coh_caixa b USING (id) WHERE b.status LIKE '%$b%' AND b.data_criacao LIKE '%$b2%' AND b.data_criacao LIKE '%$b3%' ");


Retornou esta msg de erro:

 Warning: mysql_num_rows() expects parameter 1 to be resource, boolean 
GOSTEI 0
Marcos P

Marcos P

30/03/2016

Sempre que você faz UNION as colunas retornadas nas queries devem ser as mesmas.

No seu caso, você faz < select * >. Todas as tabelas tem a mesma estrutura ?

Tente testar o código que coloquei com apenas as colunas comuns.

Por exemplo :

SELECT data_criacao FROM coh_bradesco WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT data_criacao FROM coh_itau WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT data_criacao FROM coh_santander WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT data_criacao FROM coh_pagseguro WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
UNION 
SELECT data_criacao FROM coh_caixa WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 


Quanto a questão do INNER JOIN, não entendi se é exatamente o que você precisa, pois o INNER vai recuperar os registros em tabelas diferentes, que tenham em comum uma chave de ligação entre elas. Quais as colunas que "ligam" essas tabelas ?
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Bom dia novamente Marcos,

Vou explicar resumidamente minha intenção,

Eu quero fazer um mecanismo de busca para listar por status(Pago,Pendente,Quitar Boleto) E data inicial E data final na mesma busca, na primeira mensagem deste topico, ele estava funcionando porem quando eu solicitava uma busca por pagos com data de 2016-03-21 A 2016-03-30 ele me retornava todos os registros, fiz a alteração sugerida porem retornou o erro postado, e na verdade a consulta que preciso não estão na mesma tabela, existem 5 tabelas coh_bradesco, coh_caixa, coh_itau, coh_santander, coh_pagseguro, todos os campos são iguais para todas tabelas, porem no modelo que você me sugere realmente é uma mistura de tipo de campo, são eles, 1 do tipo varchar 2 do tipo date.

da forma que vc me passou funcionou agora, tinha cometido um erro de nao informar o mysql_query anteriormente. porem eu preciso de mais campos para este select como ficaria.

$sql = mysql_query("
          SELECT data_criacao FROM coh_bradesco WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT data_criacao FROM coh_itau WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT data_criacao FROM coh_santander WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT data_criacao FROM coh_pagseguro WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT data_criacao FROM coh_caixa WHERE status LIKE '%$b%' OR (data_criacao BETWEEN '%$b2%' AND '%$b3%')
   ");
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Hum não tinha visto o post anterior sobre o select * estava escrevendo e demorei, vou tentar já passo o resultado.
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Cara, é muito bom quando funciona =), mas ainda fico na duvida como é uma consulta entre varias tabelas a maneira que estou fazendo é a mais correta? Pois no começo eu não criei uma chave estrangeira ainda está muito nublado, mas fica minha duvida, qual a maneira mais correta de realizar uma pesquisa desta...
GOSTEI 0
Marcos P

Marcos P

30/03/2016

A mais correta, normalmente, é aquela que funciona !

O ideal, contudo, é criar uma estrutura de chaves primárias e estrangeiras que, baseada em queries com INNER JOIN e índices específicos no BD, vão lhe dar a melhor performance possível.
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Muito Obrigado pela ajuda =)
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Surgiu mais uma duvida,


$b  = $_REQUEST['busca'];
$b2 = $_REQUEST['busca2'];
$b3 = $_REQUEST['busca3'];


  $sql = mysql_query("
          SELECT * FROM coh_bradesco WHERE status LIKE '%$b%' OR(data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT * FROM coh_itau WHERE status LIKE '%$b%' OR(data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT * FROM coh_santander WHERE status LIKE '%$b%' OR(data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT * FROM coh_pagseguro WHERE status LIKE '%$b%' OR(data_criacao BETWEEN '%$b2%' AND '%$b3%') 
          UNION 
          SELECT * FROM coh_caixa WHERE status LIKE '%$b%' OR(data_criacao BETWEEN '%$b2%' AND '%$b3%')
        ");


Eu gostaria de fazer com que o a query fosse executando mostrando o status pedido + data inicial até data final, desta forma está retornando um ou outro. Preciso retornar somente um tipo de status, teria como?
GOSTEI 0
Marcos P

Marcos P

30/03/2016

Troque o OR por AND...

WHERE status LIKE '%$b%' AND (data_criacao BETWEEN '%$b2%' AND '%$b3%')
GOSTEI 0
Fabiano

Fabiano

30/03/2016

$b  = $_REQUEST['busca']; = Pagos
$b2 = $_REQUEST['busca2']; = 2016-03-01
$b3 = $_REQUEST['busca3']; = 2016-03-10


  $sql = mysql_query("
          SELECT * FROM coh_bradesco WHERE status LIKE '%$b%' AND (data_criacao BETWEEN '%$b2%' AND '%$b3%') 


Desta forma por exemplo ele nao está retornando nada, porem existe valores para serem retornados, com o OR ele retorna tudo, mesmo estipulando as datas que preciso.
GOSTEI 0
Marcos P

Marcos P

30/03/2016

Isso é álgebra booleana básica !

Trabalhe com as partes isoladas do WHERE para identificar se a OUTRA PARTE do where pode ser recuperada pelo SELECT completo...

WHERE status LIKE '%$b%' ( as datas retornadas nesses status, atendem a condição do teste completo ? )

e

WHERE status (data_criacao BETWEEN '%$b2%' AND '%$b3%')  ( os status retornados nessas datas , atendem a condição do teste completo ? )
GOSTEI 0
Fabiano

Fabiano

30/03/2016

$sql = mysql_query("SELECT * FROM `coh_bradesco` WHERE (`status` = '$b') AND ((`data_criacao` BETWEEN '$b2' AND '$b3')) ORDER BY `data_criacao` DESC");


Desta forma por exemplo?
GOSTEI 0
Marcos P

Marcos P

30/03/2016

A título de TESTE, faça o que lhe indiquei, trabalhando com selects separados apenas para você entender exatamente o que cada parte de seu WHERE está selecionando !
GOSTEI 0
Fabiano

Fabiano

30/03/2016

HUm, mas teria como realizar dois selects para cada consulta teria como dar um exemplo baseado no código que postei só para eu entender melhor?
GOSTEI 0
Marcos P

Marcos P

30/03/2016

O exemplo você já colocou...

SELECT * FROM coh_bradesco WHERE (status LIKE '%$b%') AND (data_criacao BETWEEN '%$b2%' AND '%$b3%')


A questão é que os dados não estão atendendo essas condições !

Sendo assim, o select separado, a título de teste, vai permitir você entende melhor o que está acontecendo.
GOSTEI 0
Fabiano

Fabiano

30/03/2016

$b  = $_REQUEST['busca'];
$b2 = $_REQUEST['busca2'];
$b3 = $_REQUEST['busca3'];


  $sql = mysql_query("

            SELECT * FROM `coh_bradesco` WHERE (`status` LIKE '%$b%')
            UNION
            SELECT * FROM `coh_bradesco` WHERE `data_criacao` BETWEEN '$b2%' AND '$b3%'

            ORDER BY `banco` ASC, `data_criacao` DESC
    ");



Funciona ok, outra duvida surgindo, se eu faço uma busca entre as datas 2016-03-01 até 2016-03-31 com status pago OK funciona, porem se mudo nas data 2016-03-01 até 2016-04-1 com status pago retorna tudo do mes 03 e nada de outro mês como pedido na busca. tem algo a ver com o BETWEEN não realizar buscar entre meses diferentes
GOSTEI 0
Marcos P

Marcos P

30/03/2016

Teste o BETWEEN separado...
GOSTEI 0
Fabiano

Fabiano

30/03/2016

Bom dia, fiz umas pesquisas e verifiquei que a maneira de fazer a pesquisa estava errada, ex. status = pago E data ini 2016-03-01 E data fin 2016-04-01 o certo seria nas datas 2016/03/01 E 2016/04/01, o problema estava na "-" pois nao é um formato adequado. vlw pela ajuda.
GOSTEI 0
Marcos P

Marcos P

30/03/2016

Quem bom que resolveu !
GOSTEI 0
POSTAR