Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boas.
Estou com algumas dúvidas que envolvem SQL.
1 Como eu posso fazer uma consulta por palavras parecidas?
É algo como "como trabalha o 'Você quis dizer' do Google". Por exemplo, tenho a palavra "construsão" e rodo alguma query para procurar palavras parecidas em uma tabela. Se houver a palavra "construção" na tabela, ela será retornada.
2 Como ordenar uma consulta que usa "LIKE" na cláusula, pelo número de matches
Por exemplo, tenho a tabela:
+---------------------------------------+
| título | texto |
+---------------------------------------+
| Um dois três | Hum... |
| Um mais um | Leia o livro de Naum. |
| Dois três | hm... quero naum |
+---------------------------------------+
Assim, no caso, rodaria uma query:
SELECT * FROM tabela WHERE titulo LIKE "%um%" OR texto LIKE "%um%"
Mas, na hora de ordenar, eu quero que seja pelo número de vezes que a substring "um" é encontrada na linha. Por exemplo, na primeira linha seriam 2 vezes, na segunda linha seriam 3 vezes, e na terceira linha seria apenas 1 vez.
Desde já, agradeço.
@Gabriel Jacinto, muito obrigado pela resposta.
Eu citei o Google apenas como um exemplo. Você disse que eles, então, tem uma base de dados já com erros. É, tem cabimento, mas... não há como definir o nível de similaridade entre palavras?
Pensei em um loop em PHP, que correria pela string, char por char, e fosse incrementando alguma variável, que no final, calculasse uma porcentagem e devolvesse em forma do nível de similaridade entre as palavras. Não só pensei, como também fiz: http://phpbrasil.com/script-source/sRhjrAWjLyB0/7073 Mas não tenho ideia de como fazer o mesmo em uma consulta SQL simples de SELECT...
>
O Google possui um algorítimo de busca. Não sei se dá pra fazer isso com PHP. Provavelmente não. Mas você pode fazer switch pra palavras parecidas, tipo:
switch($palavra){
case "construsão":
echo "Você quis dizer <b>contrução</b>?";
break;echo "Você quis dizer <b>arnold schwarzenegger</b>?";
break;
}
Não sei se isso ajuda.
Creio que um switch não seja uma opção, pois pra cada texto, você vai ter que fazer centenas de palavras parecidas...
Vou tentar pensar em algo...seria bom pro meu sistema também...
Obrigado a todos pelas respostas.
@hufersil valeu mesmo, não conhecia dessas formas.
Mas... Agora apareço com outra dúvida :mellow:
3 Como dar preferência às linhas que estejam de acordo com uma determinada condição, mas não excluir as outras?
Por exemplo, tenho uma tabela:
+-----------+-----------+
| Nome | Cliente |
+-----------+-----------+
| Fulano | sim |
| Ciclano | nao |
| Beltrano | nao_mais |
+-----------+-----------+
Então, preciso executar uma query que, na ordenação, dê preferência aos que Cliente = "nao". Não posso ordenar numericamente ou alfabeticamente. Porém, os que Cliente != "nao" não serão excluídos. Também voltarão como resultado, mas após todos os que forem clientes.
Atualmente, faço em PHP duas queries distintas para isso, incrementando um array. Há como fazer isso em uma única query? Grato.
>
Não posso ordenar numericamente ou alfabeticamente. Porém, os que Cliente != "nao" não serão excluídos.
Acho que você poderia criar uma coluna, para dizer em qual ordem cada um se encaixa:
cliente / nao => 1
cliente / nao_mais => 2
cliente / sim => 3
E então você ordenaria por ela.
Você pode fazer isso via query mesmo:
SELECT * FROM (
SELECT nome, cliente, IF(cliente = 'nao', 1, IF(cliente = 'nao_mais', 2, 3)) as ordem
FROM tabela_cliente
) as subquery
ORDER BY ordem ASC
@braços e fique com Deus!
>
Boas.
Estou com algumas dúvidas que envolvem SQL.
1 Como eu posso fazer uma consulta por palavras parecidas?
É algo como "como trabalha o 'Você quis dizer' do Google". Por exemplo, tenho a palavra "construsão" e rodo alguma query para procurar palavras parecidas em uma tabela. Se houver a palavra "construção" na tabela, ela será retornada.
O Google possui um algorítimo de busca. Não sei se dá pra fazer isso com PHP. Provavelmente não. Mas você pode fazer switch pra palavras parecidas, tipo:
switch($palavra){
case "construsão":
case "arnold swachnegger":
Não sei se isso ajuda.