Ir para conteúdo

POWERED BY:

Arquivado

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

Paulo Caesar

com CONCAT_WS

Recommended Posts

Ae gente, apesar do meu query estar funcionando e ser relativamente rápido, tá me encafifando o tamanho da string de busca que minha função gera. Criei uma função em PHP que faz como o Google, usa ", +, -, : etc, e retorna uma string mais ou menos assim:

 

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%joatuba%'

 

Essa query foi para a palavra "joatuba" (sem aspas). O subquery ali é necessário para transformar o ID da cidade e estado em um nome legível (meio óbvio né). Agora vem a parte que me preocupa. Se a pessoa escrever na busca "super mega ultra busca grande com muitas palavras" (sem aspas), o search vai criar essa linha CONCAT_WS() para CADA palavra, e incluir o "OR" depois da string. então nesse caso ficaria:

 

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%super%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%mega%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%ultra%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%busca%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%grande%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%com%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%muitas%' OR

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) LIKE '%palavras%'

 

Primeira pergunta, existe alguma maneira de eu transformar o resultado do CONCAT_WS() em uma variável pra utilizar no LIKE? Tem problema o query ser desse tamanho? Não quero usar a busca fulltext por ter alguns problemas com palavras pequenas (não tenho permissão pra colocar o ft_min_word_len em 2).

Agora gostaria de perguntar também, tem alguma maneira melhor pra fazer essa busca?

Valeu gente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

cruz credo....

 

você faz uma função qualquer q arrume as palavras assim

 

$palavras = "'$palavra1|$palavra2|$palavra3"

 

 

depois usa regex (ou rlike) e a query fica assim (exemplo).....

 

CONCAT_WS(" ",(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`),(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`)) REGEX 'super|mega|ultra|power|blabla'

 

 

 

http://dev.mysql.com/doc/refman/5.0/en/regexp.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

HAHAHA valeu, tinha pensado no RLIKE, mas normalmente regex é lento, só não sei se no MYSQL é também

Ah e assim, quando eu devo utilizar o ^ e o $? Só quando eu vou procurar palavras específicas? (nesse caso de ser uma busca, não entraria né)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O REGEX consegue procurar texto com acento? tipo "são" e "sao" seriam a mesma coisa? Acho que é uma coisa que o LIKE teria que o RLIKE não teria?

 

EDITADO: To vendo que o jeito é a busca continuar como está, com vários CONCAT_WS'. O REGEX não funciona com acentos, não tem como usar "AND", e é, por incrível que pareça, mais lento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você disse que queria uma query "menor" foi o q eu te dei, mas obviament menor nao significa melhor rs...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah ok... bom, usando o CONCAT_WS multiplas vezes tem um impacto muito grande numa busca? Porque o teste que eu to fazendo é com dados fictícios (dev work), com uma tabela com 18 rows... ou seja, 2ms pra mim é suficiente, mas já não sei com 50000 rows. Usar o CONCAT_WS é melhor do que fazer o "OR" em cada campo? que no caso seria:

 

(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`) LIKE '%palavra%' OR

(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`) LIKE '%palavra2%' OR

(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`) LIKE '%palavra3%' OR

(SELECT `cidade` FROM `cidades` WHERE `cidades`.`id` = `veiculos`.`cidade`) LIKE '%palavra4%' OR

(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`) LIKE '%palavra%' OR

(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`) LIKE '%palavra2%' OR

(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`) LIKE '%palavra3%' OR

(SELECT `estado` FROM `estados` WHERE `estados`.`id` = `veiculos`.`estado`) LIKE '%palavra4%' OR

 

com CONCAT_WS() cairia pra 4 linhas =P

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.