Query Mysql
Boa noite, gostaria de ajuda para realizar uma consulta.
Minha query:
porem ele retorna tudo, queria separar para mostrar somente ex. pago nas datas entre 12 15.
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
Curtidas 0
Respostas
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());
$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
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 é...
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...
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
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:
estou com duvidas de como esticar este comando para todas as tabelas.
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
30/03/2016
Tentei fazer,
Retornou esta msg de erro:
$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
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 :
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 ?
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
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.
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
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
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
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.
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
30/03/2016
Muito Obrigado pela ajuda =)
GOSTEI 0
Fabiano
30/03/2016
Surgiu mais uma duvida,
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?
$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
30/03/2016
Troque o OR por AND...
WHERE status LIKE '%$b%' AND (data_criacao BETWEEN '%$b2%' AND '%$b3%')
GOSTEI 0
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
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...
e
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
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
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
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
30/03/2016
O exemplo você já colocou...
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.
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
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
30/03/2016
Teste o BETWEEN separado...
GOSTEI 0
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
30/03/2016
Quem bom que resolveu !
GOSTEI 0