Série da semana: Primeiros passos no React

Veja mais

Query Mysql

30/03/2016

1

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.
Responder

Posts

30/03/2016

Fabiano

$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.
Responder

31/03/2016

Marcos P

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%') 
Responder

31/03/2016

Fabiano

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.
Responder

31/03/2016

Fabiano

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 
Responder

31/03/2016

Marcos P

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 ?
Responder

31/03/2016

Fabiano

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%')
   ");
Responder

31/03/2016

Fabiano

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

31/03/2016

Fabiano

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...
Responder

31/03/2016

Marcos P

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.
Responder

31/03/2016

Fabiano

Muito Obrigado pela ajuda =)
Responder

04/04/2016

Fabiano

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?
Responder

05/04/2016

Marcos P

Troque o OR por AND...

WHERE status LIKE '%$b%' AND (data_criacao BETWEEN '%$b2%' AND '%$b3%')
Responder

05/04/2016

Fabiano

$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.
Responder

05/04/2016

Marcos P

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 ? )
Responder

05/04/2016

Fabiano

$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?
Responder