Jump to content

Query de busca


Daniivo

Recommended Posts

Buenas tardes.

o Objectivo è fazer uma busca como a Google, ou seja, ele vai fazer uma leitura de varias tabelas e se por exemplo o valor "joao" estiver em algum campo ele aparece o utilizador joao.

SELECT * from asegurados, aseguradoras, poliza, seguros WHERE
asegurados.id_seguros=seguros.id_seguros
AND asegurados.id_poliza=poliza.id_poliza
AND asegurados.id_aseguradoras=aseguradoras.id_aseguradoras AND bi = 'teste1' and name='teste1'

se eu fizer isto apenas com uma condição funciona ou seja

SELECT * from asegurados, aseguradoras, poliza, seguros WHERE
asegurados.id_seguros=seguros.id_seguros
AND asegurados.id_poliza=poliza.id_poliza
AND asegurados.id_aseguradoras=aseguradoras.id_aseguradoras AND name='joao'

no entanto se tiver mis que uma ele repete valores a toa

Link to comment
Share on other sites

Usa UNION.

seleccionas todos os "jooes" duma tabela, mais todos os "jooes" doutra ...

select nome, cor_dos_olhos from tabela1 where nome like 'joao'
union
select nome, cor_dos_olhos from tabela2 where nome like 'joao'
union
select nome, cor_dos_olhos from tabela3 where nome like 'joao'

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Usa UNION.

seleccionas todos os "jooes" duma tabela, mais todos os "jooes" doutra ...

select nome, cor_dos_olhos from tabela1 where nome like 'joao'
union
select nome, cor_dos_olhos from tabela2 where nome like 'joao'
union
select nome, cor_dos_olhos from tabela3 where nome like 'joao'

nao è tao simples assim!!!

è que a busca nao quero se seja apenas pelos nomes mas tb pelas polices BIs datas de nascimento etc etc

Edited by Daniivo
Link to comment
Share on other sites

valores à toa não são ... isto porque estás a pedir os dados das 4 tabelas ...

se queres somente um campo de uma tabela:

select tabela.campo from ...

se queres vários campos de uma tabela:

select tabela.campo1, tabela.campo2 from ...

se quiseres todos os campos de uma única tabela

select tabela.* from ...

se quiseres todos os campos de uma única tabela mais um campo de outra

select tabela1.*, tabela2.campo from ...

e por ai fora ...

agora para filtrar é só adicionar as condições mas não te esqueças de dizer de que tabela é

... where tabela1.campo like '%joao%' or tabela2.campo like '%joao%'
Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

valores à toa não são ... isto porque estás a pedir os dados das 4 tabelas ...

se queres somente um campo de uma tabela:

select tabela.campo from ...

se queres vários campos de uma tabela:

select tabela.campo1, tabela.campo2 from ...

se quiseres todos os campos de uma única tabela

select tabela.* from ...

SELECT * from asegurados, aseguradoras, poliza, seguros WHERE

asegurados.id_seguros=seguros.id_seguros

AND asegurados.id_poliza=poliza.id_poliza

AND asegurados.id_aseguradoras=aseguradoras.id_aseguradoras AND name='joao'

como podes ver isso est a ser feito aqui.

name='joao' ->funciona !!

AND bi = 'joao' or name='joao' -> vários echos

joao vem em uma variavel Post do form pesquisa....

Edited by Daniivo
Link to comment
Share on other sites

tens a certeza que isto está correto :

...
and asegurados.id_aseguradoras=aseguradoras.id_aseguradoras
...

esquece ... eu é que vi mal

no entanto se continuas a ter uma lista de registos não esperados de duas um

- ou tens vários registos com 'bi' e 'name' com o valor de 'teste1'

- ou tens registos com os id's iguais (o que leva a repetição na projeção)

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

nao è tao simples assim!!!

è que a busca nao quero se seja apenas pelos nomes mas tb pelas polices BIs datas de nascimento etc etc

SELECT nome, cor_dos_olhos FROM tabela1 WHERE nome LIKE '%joao%' or bi like '%joao%' or datanascimento like '%joao%'
UNION
SELECT nome, cor_dos_olhos FROM tabela2 WHERE nome LIKE '%joao%' or bi like '%joao%' or datanascimento like '%joao%'
UNION
SELECT nome, cor_dos_olhos FROM tabela3 WHERE nome LIKE '%joao%' or bi like '%joao%' or datanascimento like '%joao%'

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

eu n estou a conceguir por isto a fincionar, o asegurados.nombre like "sddsa" or poliza like "dsad" se eu procurar um nome funciona!! se meter uma poliza ele repete a base de dados toda e mais 1 , ou seja deve ser os IDs que estao repetidos mas porque precisaso de estar!!!

os id_seguros estao repetidos nos asegurados, porque precisao de estar, e isto deve estar a fazer barracadas....

Link to comment
Share on other sites

tens de perceber como os resultados são criados

um exemplo com duas tabelas

+-----------+   +-----------------+
| tabela_1  |   |    tabela_2     |
+-----------+   +-----------------+
| id | nome |   | id | ref | nome |
+----+------+   +-----------------+
|  1 | nom1 |   |  1 |   1 | nom1 |
|  2 | nom2 |   |  2 |   1 | nom2 |
+----+------+   |  3 |   2 | nom3 |
               +-----------------+

se fizeres

select * from tabela_1, tabela_2

terás o seguinte resultado

+-----------+-----------------+
| tabela_1  |     tabela_2    |
+----+------+----+-----+------+
| id | nome | id | ref | nome |
+----+------+----+-----+------+
|  1 | nom1 |  1 |   1 | nom1 |
|  1 | nom1 |  2 |   1 | nom2 |
|  1 | nom1 |  3 |   2 | nom3 |
|  2 | nom2 |  1 |   1 | nom1 |
|  2 | nom2 |  2 |   1 | nom2 |
|  2 | nom2 |  3 |   2 | nom3 |
+----+------+----+-----+------+

isto porque ele simplesmente faz corresponder a cada elemento de uma tabela todos da segunda.

neste caso terás 2(registos)*3(registos) = 6(registos).

no caso de ter mais do que duas tabelas terás o número de registos multiplicados pelo número de registos dessa tabela extra

no entanto o que se faz é escolher os registos que nos interessa, normalmente é a correspondência/relação entre campos das duas tabelas (daí o nome de modelo relacional), que nesta situação é o campo id da tabela_1 com o campo ref da tabela_2

select * from tabela_1, tabela_2 where tabela_1.id = tabela_2.ref

sendo assim terás o seguinte resultado

+-----------+-----------------+
| tabela_1  |     tabela_2    |
+----+------+----+-----+------+
| id | nome | id | ref | nome |
+----+------+----+-----+------+
|  1 | nom1 |  1 |   1 | nom1 |
|  1 | nom1 |  2 |   1 | nom2 |
|  2 | nom2 |  3 |   2 | nom3 |
+----+------+----+-----+------+

como vês, a condição tabela_1.id = tabela_2.ref +e válida em todos os casos do resultado que é um subconjunto da lista anterior

quando aplicas uma condição no teu SQL estás a filtrar registos da tabela original que é criada da maneira que te apresentei inicialmente.

conclusão : verifica os campos das tuas tabelas e as relações dadas pelas condições do SQL, depois determina o que deveria aparecer dentro dos moldes que te apresentei aqui e verás que não é "lixo" que aparece mas sim os dados das tabelas

nota : quando o query retorna mais do que um campo com o mesmo nome (no caso que te apresentei podes ver que existem mais do que um campo id) o PHP escolhe um dos dois ou mais, a ordem de seleção não sei, mas é um ponto que deverás ter em conta

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.