com CONCAT_WS
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!
Discussão (6)
Carregando comentários...