elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  Hacer una busqueda de palabra completa en mysql
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Hacer una busqueda de palabra completa en mysql  (Leído 6,668 veces)
OssoH


Desconectado Desconectado

Mensajes: 911


Ver Perfil
Hacer una busqueda de palabra completa en mysql
« en: 3 Noviembre 2021, 16:59 pm »

Quiero encontrar los registros que tengan en el campo nombre la palabra DEC.   (acabado en punto).
Si uso el RLIKE tal y como os pongo a continuación no me funciona por culpa del punto

Código:
SELECT name
FROM ps_product p LEFT JOIN ps_product_lang pl ON (pl.id_product=p.id_product)
WHERE `name` RLIKE "[[:<:]]REVIVAL[[:>:]]"
AND `name` RLIKE "[[:<:]]DEC[[:>:]]"

me devuelve :
revival dec. gris marea
revival dec. arena acuada

En cambio si pongo en RLIKE el punto al final en DEC. no me funciona

Código:
SELECT name
FROM ps_product p LEFT JOIN ps_product_lang pl ON (pl.id_product=p.id_product)
WHERE `name` RLIKE "[[:<:]]REVIVAL[[:>:]]"
AND `name` RLIKE "[[:<:]]DEC.[[:>:]]"

No devuelve ningún registro.

¿porque cuando le pongo el 'punto' no funciona? Es que tengo palabras a buscar donde el punto está dentro del string a buscar y me da problemas.

¿alguna solución?
Gracias




« Última modificación: 3 Noviembre 2021, 17:20 pm por OssoH » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #1 en: 3 Noviembre 2021, 17:21 pm »

Citar
¿porque cuando le pongo el 'punto' no funciona? Es que tengo palabras a buscar donde el punto está dentro del string a buscar y me da problemas.

¿alguna solución?

El punto en REGEX es un carácter especial. Debe ser escapado.  Considera esto:

Una base de datos llamada datos, con una sola columna varchar llamada dato. 3 inserts:

Código:
|Patata
|Patata-Frita
|Patata.Frita



Código
  1. SELECT dato FROM datos WHERE dato RLIKE '.'

Esta consulta me devuelve todos los datos porque el punto equivale a cualquier caracter.

Código
  1. SELECT dato FROM datos WHERE dato RLIKE 'Patata.'

Esta consulta me devuelve Patata-Frita y Patata.Frita porque el punto equivale a cualquier caracter.

Código
  1. SELECT dato FROM datos WHERE dato RLIKE 'Patata\\.'

Esta consulta me devuelve solo Patata.Frita, porque he escapado el punto.


https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-syntax

Saludos


En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #2 en: 3 Noviembre 2021, 17:41 pm »

El punto en REGEX es un carácter especial. Debe ser escapado.  Considera esto:

Una base de datos llamada datos, con una sola columna varchar llamada dato. 3 inserts:

Código:
|Patata
|Patata-Frita
|Patata.Frita



Código
  1. SELECT dato FROM datos WHERE dato RLIKE '.'

Esta consulta me devuelve todos los datos porque el punto equivale a cualquier caracter.

Código
  1. SELECT dato FROM datos WHERE dato RLIKE 'Patata.'

Esta consulta me devuelve Patata-Frita y Patata.Frita porque el punto equivale a cualquier caracter.

Código
  1. SELECT dato FROM datos WHERE dato RLIKE 'Patata\\.'

Esta consulta me devuelve solo Patata.Frita, porque he escapado el punto.


https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-syntax

Saludos

Aunque escapes el punto, no vas a obtener un match en este caso. Si bien el punto es un carácter que significa cualquier carácter excepto saltos de línea, sin escaparse el punto puede representar el punto literalmente (y los otros caracteres como has puesto). Así que aquí debería poder hacer match a DEC.... (y también DECA, DECB etc).

Yo creo que el problema aquí es con el marcador de final de palabra:

[[:>:]]

En este caso, el delimitador de una palabra está dado por el mismo punto. Lo que significa que el punto nunca llega a ser parte de la palabra. Por lo tanto:

Código
  1. '[[:<:]]PALABRA[[:>:]]'

PALABRA nunca hará match si incluye un punto (porque el punto es el delimitador que indica el final de la palabra).
En línea

OssoH


Desconectado Desconectado

Mensajes: 911


Ver Perfil
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #3 en: 3 Noviembre 2021, 17:46 pm »

Gracias por la explicación.
Pero yo quiero que busque cadenas de palabras completas y no fragmentos de cadena donde tenga la cadena de busqueda.

Es decir, si tengo
Código:
|Patata
|Patata-Frita
|Patata.Frita

Y escribo
SELECT dato FROM datos WHERE dato RLIKE 'patata'

me devolveria los 3 registros porque contienen la palabra patata cuando solo me deberia devolver la primera [patata].
Es decir que busque palabras completas y se considera palabra completa la separada por un espacio.

Ej :
arbol caido  => 2 palabras
arbol.caido => 1 palabra

Espero haberme explicado bien
Gracias



[
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #4 en: 3 Noviembre 2021, 18:01 pm »

Gracias por la explicación.
Pero yo quiero que busque cadenas de palabras completas y no fragmentos de cadena donde tenga la cadena de busqueda.

Es decir, si tengo
Código:
|Patata
|Patata-Frita
|Patata.Frita

Y escribo
SELECT dato FROM datos WHERE dato RLIKE 'patata'

me devolveria los 3 registros porque contienen la palabra patata cuando solo me deberia devolver la primera [patata].
Es decir que busque palabras completas y se considera palabra completa la separada por un espacio.

Ej :
arbol caido  => 2 palabras
arbol.caido => 1 palabra

Espero haberme explicado bien
Gracias



[

Entonces no puedes usar: [[:<:]] ni [[:>:]], porque esos caracteres consideran PATATA-FRITA como dos palabras. Podrías usar:

Código
  1. "(^|[[:blank:]]+)DEC\\.([[:blank:]]+|$)"
En línea

OssoH


Desconectado Desconectado

Mensajes: 911


Ver Perfil
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #5 en: 3 Noviembre 2021, 18:07 pm »

Entonces no puedes usar: [[:<:]] ni [[:>:]], porque esos caracteres consideran PATATA-FRITA como dos palabras. Podrías usar:

Código
  1. "(^|[[:blank:]]+)DEC\\.([[:blank:]]+|$)"

PERFECTOOOO FUNCIONA.
MUCHAS GRACIASSSSS
 ;-) ;-) ;-) ;-) ;-) ;-)
En línea

el-brujo
ehn
***
Desconectado Desconectado

Mensajes: 21.637


La libertad no se suplica, se conquista


Ver Perfil WWW
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #6 en: 17 Noviembre 2021, 10:45 am »

Buscar en MySQL es un "rollo" a parte que es muy lento.

En el foro usamos el buscador Sphinx para MySQL (MariaDB) que funciona mucho más rápido.
En línea

Mramirez

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Hacer una busqueda de palabra completa en mysql
« Respuesta #7 en: 7 Diciembre 2021, 00:05 am »

Buen post  ;D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines