Logo Hardware.com.br
AValle
AValle Geek Registrado
4.4K Mensagens 10 Curtidas

Dúvida feia sobre consulta no MySQL

#1 Por AValle 10/02/2005 - 12:02
Pessoal, imaginem o seguinte:

Tenho uma tabela chamada TABNOMES com um campo NOMES.
Nesse campo tenho vários nomes completos cadastrados, e preciso consultar apenas aqueles que possuem a string 'Angelo' lá dentro.

A solução é simples:
"select NOMES from TABNOMES where NOMES like '%Angelo%'"

Agora que vem o meu problema:
E se for ao contrário???

Tabela TABNOMES
Campo NOMES mas não com os nomes completos e sim com um nome (ou parte deles)

Um exemplo:
Tenho a string 'Angelo Valle' e preciso verificar se tem alguma referência a meu nome na tabela NOMES, como um 'Ang', ou 'Vall'.
Esses valores cadastrados não tem tamanho fixo. Podem ter de 3 a 15 caracteres.

Caramba, "like reverso"?? risos

Sei que dá pra fazer usando o php mesmo, mas isso vai exigir mais de uma consulta e é pra uma coisa que não pode ter muito load. O ideal é apenas uma query ou então nem vale a pena fazer.

Consegui explicar? teoricamente sairia um "like ao contrário", como um "select NOMES from TABNOMES where '%Angelo Valle%' like NOMES"

Claro que isso não funciona. E eu já olhei pra caramba a referência do mysql e não encontrei nada. Nem a vela do Santo Google resolveu.

Se alguém puder dar uma luz, já será de ótimo tamanho big_green.png
Ah, a versão que eu uso aqui é a 4.0.23
Kleber Costa
Kleber Costa General de Pijama Registrado
5.2K Mensagens 1 Curtida
#4 Por Kleber Costa
11/02/2005 - 08:21
Fala chefe, tem um erro nessa query mas é pq não achei como resolver e to meio apressado pra não perder aula!


$procura = "Maria"; #exemplo
$sqlQuery = "(SELECT pessoas.nome FROM pessoas WHERE pessoas.nome LIKE '%$procura%')";
$sqlQuery .= "UNION (SELECT pessoas.nome FROM pessoas WHERE pessoas.nome LIKE ";
$sqlQuery .= "'%SUBSTRING('" . $procura . "',1,3)% OR '%SUBSTRING('" . $procura . "',2,3)%' OR)";
$sqlQuery .= "'%SUBSTRING('" . $procura . "',3,3)% OR '%SUBSTRING('" . $procura . "',4,3)%' OR)";
$sqlQuery .= "'%SUBSTRING('" . $procura . "',5,3)% OR '%SUBSTRING('" . $procura . "',6,3)%' OR)";
$sqlQuery .= "'%SUBSTRING('" . $procura . "',7,3)% OR '%SUBSTRING('" . $procura . "',8,3)%' OR)";
$sqlQuery .= "'%SUBSTRING('" . $procura . "',9,3)% OR '%SUBSTRING('" . $procura . "',10,3)%' OR)";
$sqlQuery .= "'%SUBSTRING('" . $procura . "',11,3)% OR '%SUBSTRING('" . $procura . "',12,3)%')";


O problema é como concatenar a query pro mysql aceitar -> OR '%SUBSTRING('" . $procura . "',2,3)%' e procurar por mar e não por substring(maria,2,3). Sacou onde esta o problema?
Salve! Ó terra dos altos coqueiros!
De belezas soberbo estendal!
Nova Roma dos bravos guerreiros
Pernambuco, imortal, imortal!


Linux User #262254
AValle
AValle Geek Registrado
4.4K Mensagens 10 Curtidas
#6 Por AValle
11/02/2005 - 09:18
Lgub
AValle, se você for usar like no inicio e fim da query a consulta vai ficar muito pesada, não é melhor quebrar esse c...

Não dá. Tô contornando o problema com uma função em php que faz um while e busca a string semelhante via strpos.

Enquanto a tabela for pequena vai funcionar direito, meu receio é quando a maledita crescer.

Pra diminuir o impacto usei a função mysql_unbuffered_query:
http://br.php.net/manual/en/function.mysql-unbuffered-query.php

É que estou fazendo um sistema de banlist para um site. A cada login ou cadastro terei que executar a função que verifica se o usuário está lá na lista negra, e tenho que tomar o devido cuidado de não explorar demais a boa vontade do mysql.
Kleber Costa
Kleber Costa General de Pijama Registrado
5.2K Mensagens 1 Curtida
#8 Por Kleber Costa
11/02/2005 - 13:05
disponnha :wink:

tem um erro grosseiro lá no meu post oops.png não é like '%vwv%' or '%dtbeb%' , o correto é pessoas.nome like '%rwrwr%' or pessoas.nome like '%wefgwg%' e assim por diante!

Eu passei mais uns 40 min procurando como fazer direto no sql mas num deu. Como c tá preocupado com performance vai ser melhor tratar isso no php e depois mandar pro mysql. Daquela forma que eu coloquei em alguns casos o banco vai fazer pesquisas sem necessidade pq estará vazio o campo de busca, tipo -> procurar por "ang" vai ter muito like '%%' pq lá em cima eu coloquei até 15 letras como vc pediu. Isso seria a mesma coisa -> select pessoas.nome from pessoas e select pessoas.nome from pessoas where pessoas.nome like '%%'! nesse caso iria sobrecarregar o banco e além do mais estaria errado frown.png

aqui tem um código que eu fiz, acho que tá bem legal, se for isso que vc realmente precisa, já tá pronto big_green.png


<?php

$procurar = "Maria";

$size = strlen($procurar);

$substring = array();

for ($i = 0 ; $i < ($size - 3) ; $i++){

$sub = trim(substr($procurar, $i, 3));

if (strlen($sub) == 3){
array_push($substring,$sub);
}

}

# numpos -> Número de Posições
$numpos = sizeof($substring);

# Caso seja menor ou igual a 1 posição no array, a busca fica simples. Exemplo: $procurar = "ang"
if ($numpos <= 1){

$sqlQuery = "SELECT pessoas.nome FROM pessoas WHERE pessoas.nome LIKE '%$procurar%'";

} else {

$sqlQuery = "(SELECT pessoas.nome FROM pessoas WHERE pessoas.nome LIKE '%$procurar%') UNION (SELECT pessoas.nome FROM pessoas WHERE pessoas.nome LIKE";

for ($i = 0 ; $i <= ($numpos - 1) ; $i++){

if ($i == ($numpos - 1)){

$sqlQuery .= " '%$substring[$i]%')";

} else {

$sqlQuery .= " '%$substring[$i]%' OR pessoas.nome LIKE";

}
}
}

#parte de conectar e tal..
?>
Salve! Ó terra dos altos coqueiros!
De belezas soberbo estendal!
Nova Roma dos bravos guerreiros
Pernambuco, imortal, imortal!


Linux User #262254
AValle
AValle Geek Registrado
4.4K Mensagens 10 Curtidas
#9 Por AValle
11/02/2005 - 16:19
Fiz isso aqui, tá funcionando:

function verifica($busca) {
global $conn;
$sql="select campo from tabela where campo!= ''";
$res=mysql_unbuffered_query($sql,$conn);
$busca="_" . strtoupper($busca);
if ($res) {
while($row=mysql_fetch_object($res)) {
$resposta=$row->campo;
$resposta=strtoupper($resposta);
if (strpos($busca,$resposta)>0) {
$RES = "1";
}
else {
$RES = "0";
}
}
}
else {
$RES = "0";
}
return $RES;
}


Se tiver variável com nome trocado ignorem. É que não postei as corretas por motivos óbvios de segurança (sql injection e etc).

Usei 0 e 1 porque por algum motivo distante de meu conhecimento o return não deixava o while girar.

Bem, espero que não afete o desempenho oops.png
Espero também que minha função e o exemplo do chefe Kleber ajude o pessoal que acabe caindo aqui em alguma busca por esta solução.

Pessoal, muito obrigado pelo help. big_green.png
Acquila
Acquila Super Participante Registrado
651 Mensagens 9 Curtidas
#10 Por Acquila
12/02/2005 - 16:19
Ô Valle, pelo que eu entendi vc pode usar a função locate(). Eu não sei se ela já esta implementada na versão 4.0.x do mysql, mas se estiver vc consegue obter o que vc quer com uma única consulta. Tenta assim:

A tabela 'usuário' contem o campo UserId com fragmentos do nome, digamos 'ang'. Para saber se 'ang' está contido na string de busca 'angelo vale', use a seguinte query:

select * from usuario where locate(UserId,'Angelo Vale') >0



Tenta aê..

[]!
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal