Pesquisa de Dados com Mysql

9 views
Skip to first unread message

Sérgio Bastos

unread,
Jan 26, 2012, 7:46:57 PM1/26/12
to cfbr...@googlegroups.com
Boa noite!
 
Pessoal estou tendo um probleminha com um filtro de pesquisa que estou tentando fazer.
Abaixo segue o código para visualização.
 
<cfif IsDefined("form.bt_consulta")>
 <cfquery name="clientes" datasource="#dsn#">
      select * from sis_pf, interesse where 0=0
             <cfif #form.nome# neq ""> and nome like '#form.nome#%'
                      <cfelseif #form.cpf# neq ""> and cpf like '#form.cpf#%'
                                           <cfelseif #form.interesse1# neq ""> and interesse.interesse1 like '#form.interesse1#%'
                                           </cfif>
                                           
            order by nome
                        
 </cfquery>
 <cfelse>
   
  <cfquery name="clientes" datasource="#dsn#">
      select id_pf, nome, cpf, email, tel_res from sis_pf order by nome asc
     </cfquery>
</cfif>
 
O problema é que quando é realizado a pesquisa é retornado varias vezes o mesmo nome, além de demorar muito e tem um outro problema que é no campo interesse1, note que este campo vem de uma outra tabela e eu uso um cfselect para exibir os dados, então ao realizar a pesquisa um cadastro já vem preenchido e quando é feito não tem como eu retirar.
 
Agradeço antecipadamente aos CF'S que poderem ajudar.
 
Att,
 
Sérgio.
 
 

Carlos Felipe Ribeiro Maradeia

unread,
Jan 26, 2012, 7:52:42 PM1/26/12
to cfbr...@googlegroups.com
Não consegui entender o seu problema.
Mas em questão da consulta retornar varias vezes o mesmo nome é pq vc esta fazendo o join entre 2 tabela mas nao existe um atributo que esteja linkando as 2 informações. Falta uma chave estrangeira em alguma das tabelas.



 
 

--
Você recebeu este e-mail pois está cadastrado na lista ColdFusion Brasil
Para CANCELAR sua assinatura escreva para cfbrasil+u...@googlegroups.com
Para ASSINAR a lista escreva para cfbrasil+...@googlegroups.com
O endereço para ENVIO DE MENSAGENS da lista é cfbr...@googlegroups.com
REGRAS em http://groups.google.com/group/cfbrasil/web/regras-de-boa-convivncia-na-lista
Outras opções disponíveis em http://groups.google.com/group/cfbrasil



--
Carlos Felipe Ribeiro Maradeia

Sérgio Bastos

unread,
Jan 26, 2012, 8:07:09 PM1/26/12
to cfbr...@googlegroups.com
Oi Carlos,
 
Sou iniciante com SQL e não consigo enchegar aonde posso implementar, fiz um teste agora com o que eu entendi porém esta dando erros:
 
 
<cfif IsDefined("form.bt_consulta")>
 <cfquery name="clientes" datasource="#dsn#">
      select * from sis_pf inner join interesse where 0=0
             <cfif #form.nome# neq ""> and nome like '#form.nome#%'
                      <cfelseif #form.cpf# neq ""> and cpf like '#form.cpf#%'
                                           <cfelseif #form.interesse1# neq ""> and interesse.interesse1 like '#form.interesse1#%'
                                           </cfif>
   where interesse.id_pf = sis_pf.id_pf                                           
            order by nome
                        
 </cfquery>
 <cfelse>
   
  <cfquery name="clientes" datasource="#dsn#">
      select id_pf, nome, cpf, email, tel_res from sis_pf order by nome asc
     </cfquery>
</cfif>
 
Você poderia me dar um exemplo.

Carlos Felipe Ribeiro Maradeia

unread,
Jan 26, 2012, 8:14:22 PM1/26/12
to cfbr...@googlegroups.com
Sergio aconselho vc dar uma estudada no SQL e principalmente nas modelagem de BDs
Seu INNER JOIN está incompleto, está faltando justamente a chave estrangeira.

segue um exemplo:

Tabela Clientes
- cod_cliente
- nome

Tabela Pedidos
- nr_pedido
- Valor
- cod_cliente_fk

Vamos supor que vc queria pegar valores dos pedidos de um determinado cliente que tem cod_cliente = 5, o select ficaria assim:

SELECT nome, nr_pedido, valor
FROM Pedidos INNER JOIN Cliente ON cod_cliente_fk = cod_cliente
WHERE cod_cliente = 5

Entendeu ?

Sérgio Bastos

unread,
Jan 26, 2012, 10:49:47 PM1/26/12
to cfbr...@googlegroups.com
Oi Carlos!
 
Sei que a base para programar é saber SQL e começo a estudar este semestre na facul, tudo que sei foi metendo as caras, agradeço muito pelas explicações.
 
Entendi, já faço em alguns casos, queria mesmo um exemplo de como deveria fazer para funcionar um formulario para retornar a pesquisa.
 
Exp. Input {nome} Input {CPF} e um Select {Empresa}
 
Onde nome e cpf faz parte da tabela cliente e empresa é uma outra tabela --> neste select eu trago as empresas cadastradas e minha consulta deve trazer as pessoas que tem algum relacionamento com esta empresa.
Meu banco já esta modelado, neste sistema eu tenho minhas tabelas com chaves primarias e chaves estrangeiras.
Seguindo este mesmo exemplo no qual você descreveu.
 
Agradecimentos antecipados,
 
Sérgio
 
 
 
Eu preciso fazer essa consulta de forma eficiente e não trazer os mesmos dados varias vezes.

Rox Designer

unread,
Jan 26, 2012, 10:57:19 PM1/26/12
to cfbr...@googlegroups.com
Select campos from empresa join pessoas on empresa.campo = pessoas campos.

Faça uma busca por inner join. Left outter join. Vai abrir sua mente!


Em 27/01/12, Sérgio Bastos<sergio...@gmail.com> escreveu:

--
Enviado do meu celular

Roberto Fonseca Alves [image: Twitter] <http://twitter.com/theroxf>
Desenvolvimento e Design
Tel: +55 (19) 8192-6940 <http://www.factorystudio.us>

Charles Reitz

unread,
Jan 27, 2012, 5:28:43 AM1/27/12
to cfbr...@googlegroups.com
Sérgio,

Exemplo no html com cf de como deve utilizar ao retornar uma pesquisa em um campo de select. 


<cfquery name="tipo_profissional" datasource="#ds#">
SELECT IDE_TIPO_PROFISSIONAL, DES_TIPO_PROFISSIONAL
FROM tip_profissional ORDER BY DES_TIPO_PROFISSIONAL asc
</cfquery>

SELECT
<select name="tip_profissional" id="tip_profissional">
<cfoutput  query="tipo_profissional">
<option value="#IDE_TIPO_PROFISSIONAL#">#DES_TIPO_PROFISSIONAL#</option>
</cfoutput>
</select>

INPUT
<cfinput type="text" value="#tip_profissional.des_tipo_profissional#" name="des_sobrenom_profissional">

Me corrigida se estiver errado sobre sua dúvida, porém pelo que entendi foi isso.

Grande Abraço,

Att.

Charles Reitz
Twitter: http://twitter.com/charlesreitz                           
Email/Gtalk: charles...@gmail.com

"Às vezes a vida vai-te golpear a cabeça com um tijolo. Não percas a fé." Steve Jobs

Rafael Bandeira Rodrigues

unread,
Jan 27, 2012, 7:49:49 AM1/27/12
to cfbr...@googlegroups.com
Bom vamos por partes:
  1. faltou o relacionamento das tabelas
  2. especifica os campos ao invez de usar o *, ele é bom para testes somente
  3. é bom usar o cfqueryparam para melhorar performace e segurança
  4. evita essa sequencia de elseif até porque em algum momento você pode usar os filtros somados, nome, cpf e interresse
  5. da uma olhada se esse % no CPF é necessário, porque CFP são 11 caracteres ou 14 se você estiver cadastrando com mascara, o que também não é recomendado

Exemplo de como pode ficar

<cfquery name="clientes" datasource="#dsn#">
select        *
  from        sis_pf
       ,        interesse
 where        0 = 0

   and        sis_pf.id = interesse.id
<cfif form.nome neq "">and nome like <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.nome#%" /></cfif>
<cfif form.cpf neq "">and cpf like <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.cpf#%" /></cfif>
<cfif form.interesse1 neq "">and interesse.interesse1 like <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.interesse1#%" /></cfif>
order by nome
</cfquery>


Obrigado,

Rafael Bandeira Rodrigues
Chief Executive Officer
FlagNet - Soluções em Tecnologia
http://www.flagnet.inf.br/

Adobe ColdFusion 8 Certified Expert
Adobe ColdFusion MX 7 Certified Developer
Adobe Certified Professional
Adobe Certified Instructor
Adobe Certified Expert
Fusebox - BRASIL
http://www.fusebox.com.br/
RafaBand - BlogSpot.com
http://rafaband.blogspot.com/
FlagNet - Twiter
http://twitter.com/flagnet/

"Pensar apenas ou desejar somente nunca levou ninguém a lugar nenhum. É necessário também a ação" - William Shakespeare



Em 26 de janeiro de 2012 22:46, Sérgio Bastos <sergio...@gmail.com> escreveu:
 
 

--

Tadeu

unread,
Jan 26, 2012, 8:07:40 PM1/26/12
to cfbr...@googlegroups.com
Caro,

  Você pode usar a busca por CPF através da IGUALDADE ao invés do LIKE uma vez que CPF é uma chave candidata.

  Os campos que vc usa o LIKE '#xxxxxxx#%", pode cirar um índice "COM DUPLICADOS" para cada campo utilizado. No caso um índice para NOME e outro para INTERESSE. Mas..... cuidado se sua tabela tiver muitas atualizações (INSERT/UPDATE) pois muitos índices podem deixar as atualizações da tabela mais lenta, além de maior espaço em disco.

  Após a criação dos índices veja a estratégia utilizada pelo OTIMIZADOR DE CONSULTA do MySQL.

--
Att.,
Tadeu P.Bastos  
  

Em 26 de janeiro de 2012 22:46, Sérgio Bastos <sergio...@gmail.com> escreveu:

Sérgio Bastos

unread,
Jan 27, 2012, 10:07:19 PM1/27/12
to cfbr...@googlegroups.com
Olá pessoal!
 
Agradeço a todos pelo suporte.
A explicação com o código do Rafael funcionou perfeitamente.
 
Grato,
 
Sérgio

Reply all
Reply to author
Forward
0 new messages