Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jean Franceschi

Buscando no BD por aproximação!

Recommended Posts

Olá meus queridos... Gosto de vir aqui encher a paciência de vcs um pouco ás vezes... e agora não podia ser diferente.

 

Sou meio (quase todo) nub nos assuntos asp, sei pouco, mas é pouco mesmo.

Estou quebrando a cabeça demais pra achar uma solução para isso e não tenho conseguido.

 

A idéia é simples, ao invés de buscar por "ordem" ou por algo do tipo em um campo numérico do banco de dados, eu queria buscar por aproximação.

 

Exemplo... no banco de dados tenho registros aleatórios entre 2 campos (vou chamar de campo1 e campo2) e digamos que a ordem que foram cadastrados seja a seguinte:

 

 

Campo1 | Campo2

05 | 10

32 | 25

04 | 13

26 | 11

17 | 21

09 | 09

 

(Coloquei 0 nos números 5, 4,9 senão fica desarrumado e o fórum da erro quando usa o código pra tabelas!!)

 

Notem que o campo 1 contém um número e o campo 2 outro e eles não estão em ordem. Porém, para fazer a chamada no código ASP, não consegui uma forma de colocar isso ordenadamente através de uma busca, como por exemplo:

 

Set VarQualquer = Conexao_Qualquer.Execute("SELECT * FROM QualquerTabela ORDER BY Campo1=15 AND Campo2=22")

' Neste código acima faria uma busca exata, onde o campo1 é igual a 15 e o campo2 é igual a 22

Acontece que os comando que eu conheço existentes tem apenas para igualar campos (como alí em cima, onde acha exato o que se procura) e outros básicos, como por exemplo '<>' (Diferente de) ou '>' (Maior) ou '<' (Menor), etc... mas nada disso é o que estou procurando...

 

Quero fazer da seguinte forma:

 

Já que não é feita uma busca e sim apenas uma ordenação, então, gostaria que fosse colocado o seguinte com a suposição:

 

registro 1 (campo1) = 10

registro 2 (campo1) = 5

registro 3 (campo1) = 15

registro 4 (campo1) = 20

 

Então a busca começando a partir do número 13 daria:

 

 

registro 3 (campo1) = 15 (este primeiro pq é o mais próximo do número 13)

registro 1 (campo1) = 10 (este segundo pelo mesmo motivo)

registro 4 (campo1) = 20

registro 2 (campo1) = 5

 

 

Feito isso, o resultado seria nãoa penas em um campo, mas sim dois campos (ta complicado explicar, imagina pra vcs me entenderem) =(

Bem, caso alguém tenha entendido e saiba como ajudar, agradeço muito...

 

 

Masssss... Alguns vão me dar a idéia de colocar em Arrays os registros e depois ordenar eles. Parece simples e prático, mas digamos q eu esteja buscando mostrar isso em uma tabela com 50 mil registros? Não seria legal ter tanto array ^^, tão pouco rodar 50 mil registros pra fazer verificação um por um...

Como falei, qualquer idéia é super bem vinda, pq eu? Sinceramente estou perdido... ia dizer q deu vontade de chorar... mas se ficar muito emocionante a sua leitura posso acabar distraindo vcs do foco =P

 

 

Valeuzão gente... agradeço a atenção =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente, parece q encontrei algo que parece funcionar:

 

 

Set VarQualquer = Conexao_Qualquer.Execute("SELECT * FROM QualquerTabela ORDER BY Campo1^15, Campo2^22")

Veja que usei um expoente (^) para conseguir a aproximação pra mais ou pra menos (já que o compo1 e campo2 são numéricos... Porém, não consegui fazer os dois trabalharem juntos, ou seja, se colocarem juntos na ordem. A única maneira que consegui foi utilizando a virgula(,), porém desta forma ele não indica os números mais próximos do campo1 e campo2 e sim ele lista os amis próximos do campo1 e se tiver igualdade, do campo2...

 

Queria algo que use alguma forma como o AND... pra buscar ao mesmo tempo pelo campo1 e campo2, ficando algo parecido com isso:

 

 

Set VarQualquer = Conexao_Qualquer.Execute("SELECT * FROM QualquerTabela ORDER BY Campo1^15 AND Campo2^22")

O único problema é q o retorno de 1, 11, 111, 1111, da maior que 2 (por exemplo). Pra isso ainda não achei solução tbm =\

Isso deve ser uma excessão do uso do expoente(^)...

 

Será q tem algo parecido pra ajudar? fiquei mais preocupado achando só metade da solução =(

Tava triste... fiquei feliz!! Agora tô triste de novo =(

 

Dêem um help! please!!! *.*

Compartilhar este post


Link para o post
Compartilhar em outros sites

se usar o like nao tem o resultado que deseja ?

"SELECT * FROM tabela where campo like '%"&variavel&"%' or campo2 like '%"&variavel2&"%'"

 

Like seve como uma busca unida ao WHERE... procuro uma forma de ordenar a tabela (para mais e para menos) entre dois campos, fazendo aproximação de um determinado número. Exemplo: Se o número que vai determinar a ordem for o nº 100, então a ordem ficaria assim:

 

100 (a ordem é iniciada neste número, que pode ser qualquer outro)

45 (este mostra por segundo pq é o mais próximo de 100)

-50 (depois este)

256 (depois este)

342 (depois este)

-259 (depois este)

etc...

 

Então viria o mais complicado ainda, que seria fazer isso, mas em duas colunas e não apenas em uma ^^

Seria algo tipo: ORDER BY Campo1(comando de aproimação)100 AND Campo2(comando de aproimação)500

Procure por between, no caso é uma instrução sql que fa a comparação entre 2 valores, acho que para o seu caso vai servir.

 

 

SELECT * FROM Persons

WHERE LastName

NOT BETWEEN 'Hansen' AND 'Pettersen'

 

 

Note que o q eu procuro é na "Ordenação" dos resultados (de todos) e não de uma busca interna... por isso o trabalho não é do WHERE e sim do ORDER BY.

Infelismente BETWEEN não funciona neste caso... mas valeu a tentativa =(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tinha um user que esta com essa mesma dúvida veja aqui

 

http://forum.imasters.com.br/index.php?/topic/407191-2-parametros-order/

 

 

Não é a mesma dúvida, no caso dele é simples, no meu caso preciso de uma listagem dupla e não pela ordem e sim pela aproximação... note q ele queria em ordem alfabética, eu preciso que liste dois campos numéricos, e não pela ordem e sim pela aproximação... quanto mais perto o número X for, antes ele aparee na lista ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara.. seguinte... acho que só com SQL você nao vai conseguir resolver o seu problema..

No seu lugar.. eu faria uma consulta normal.... SELECT * FROM tabela.... ai dentro do LOOP eu usaria o numero que foi o indice da pesquisa para fazer os calculos.... ou seja...

Dentro do While, eu faria algumas operações matemáticas para determinar qual é o valor mais próximo do número pesquisado...

Uma vez verificado o numero, colocaria a ordem em um array, e exibiria os resultados a partir deste array....

 

Conseguiu compreender ??

 

Att;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara.. seguinte... acho que só com SQL você nao vai conseguir resolver o seu problema..

No seu lugar.. eu faria uma consulta normal.... SELECT * FROM tabela.... ai dentro do LOOP eu usaria o numero que foi o indice da pesquisa para fazer os calculos.... ou seja...

Dentro do While, eu faria algumas operações matemáticas para determinar qual é o valor mais próximo do número pesquisado...

Uma vez verificado o numero, colocaria a ordem em um array, e exibiria os resultados a partir deste array....

 

Conseguiu compreender ??

 

Att;

 

 

Acho q entendi sim... pensei em fazer desta forma, mas colocar em um array e fazer verificações em tabelas com 50 mil resgistros iria detonar o servidor, imagina uma pessoa abrindo essa página a cada 5 ou 10 segundos? Iria ficar realmente muito pesado pra qualquer servidor =(

 

 

 

Bem, seguinte, pra vcs me ajudarem achar uma resposta, vou colocar um exemplo simples e prático.

É um jogo online, alguns devem conhecer. Neste jogo o mapa de localização funciona de forma simples: X e Y sendo X a altura e Y a largura. Acontece q este mapa tem 400 de largura (positivo) e -400 de largura (negativo), o mesmo para o Y (altura).

 

Quando alguém digamos que na posição X=150 e Y=-90 coloca algo pra vender, é feito um registro com a mercadoria, o preço, a localização X e a localização Y da posição desta mercadoria.

 

Então, digamos que 50 mil pessoas colocaram algo a venda, gerando 50 mil registros onde X varia entre -400 e 400 e Y varia entre -400 e 400.

Quando alguém vai ver as mercadorias colocadas a venda, o sistema verifica a sua posição (X e Y da sua base) e mostra os registros existentes (aqueles 50 mil de antes) por ordem de proximidade... ou seja, quem tiver mais perto da base que está procurando mercadorias, terá sua amostra antes. Assim, digamos q um mercador demore uma hora pra andar 4 quadrados (seja este pra qualquer lado), ele verá as q demoram menos pra chegar em sua base nas primeiras colocações ^^

 

Não sei se é permitido colocar o site do jogo pra vcs darem uma olhadinha como foi feito, mas pela idéia parece simples de se entender.

Acho que agora eu consegui me explicar um pouco melhor sobre o que procuro =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.