Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Buscar un n.º dentro de un texto

Estas en el tema de Buscar un n.º dentro de un texto en el foro de Mysql en Foros del Web. Hola a todos. Tengo estas dos tablas tabla1 ID TEXT 1 "10" 2 "10,35" 3 "" 4 "10,35,60" tabla2 ID TEXT 10 "hola" 35 "hoo!" ...
  #1 (permalink)  
Antiguo 16/12/2015, 16:41
 
Fecha de Ingreso: diciembre-2015
Mensajes: 10
Antigüedad: 8 años, 4 meses
Puntos: 0
Buscar un n.º dentro de un texto

Hola a todos.

Tengo estas dos tablas

tabla1
ID TEXT
1 "10"
2 "10,35"
3 ""
4 "10,35,60"


tabla2
ID TEXT
10 "hola"
35 "hoo!"
60 "adios"


Quisiera buscar la un número referente a la culumna de un ID dentro de otra columna que contiene texto, para encontrar aquellos términos que contenga una palabra

Código SQL:
Ver original
  1. SELECT *
  2. FROM
  3.   tabla 1 u, tabla2 t
  4.  WHERE
  5.       (u.text LIKE CONVERT(t.id USING latin1)) && (t.text LIKE '%ho%');

Alguna

Última edición por gnzsoloyo; 16/12/2015 a las 18:26
  #2 (permalink)  
Antiguo 16/12/2015, 16:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Buscar un n.º dentro de un texto

te explicas un poco mejor? con peras y manzanas si es posible :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 17/12/2015, 09:58
 
Fecha de Ingreso: diciembre-2015
Mensajes: 10
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Buscar un n.º dentro de un texto

Intentaré explicar mejor mi propósito.

Tabla 1 (compradores)
ID TEXT
1 "10"
2 "10,35"
3 ""
4 "10,35,60"


Tabla 2 (productos)
ID TEXT
10 "peras"
35 "naranjas"
60 "manzanas"


La cuestión sería conocer que compradores compran naranjas


Cita:
Iniciado por Libras Ver Mensaje
te explicas un poco mejor? con peras y manzanas si es posible :P
  #4 (permalink)  
Antiguo 17/12/2015, 13:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Buscar un n.º dentro de un texto

Cita:
Tabla 1 (compradores)
ID TEXT
1 "10"
2 "10,35"
3 ""
4 "10,35,60"
Eso que tienes se denomina "campo multivaluado", y están expresamente prohibidos en las bases de datos relacionales. Son un error de diseño de los peores y es por eso que cualquier consulta que hagas sólo te traerá problemas.

Si tienes una relación entre Compradores y Producto, NO se resuelve con un campo así, sino con una tabla intermedia relacional, que posee un registro por cada par relacionado de Comprador-Producto.

Yo que tu rediseño todo. Perdería menos tiempo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 17/12/2015, 16:11
 
Fecha de Ingreso: diciembre-2015
Mensajes: 10
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Buscar un n.º dentro de un texto

Ya, pero el reto está en resolverlo mediante una sentencia.

Por eso pregunto la posibilidad de convertir el valor numérico del identificador del producto en texto para así poder compararlo mediante un LIKE
  #6 (permalink)  
Antiguo 17/12/2015, 16:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Buscar un n.º dentro de un texto

Eso no es un "reto", esnun defecto de diseño que en la Facultad haría que reprobaras la materia.

Mira, si la vas a usar con LIKE, desde ya NO SIRVE. LIKE está definido para cadenas de caracteres y no para magnitudes escalares. Un ID no es parecido a. Es igual, mayor, menor o dentro de un rango, pero no es "parecido a".
Sólo podrias usarlo en el WHERE utilizando funciones como FIND_IN_SET ().
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/12/2015, 16:48
 
Fecha de Ingreso: diciembre-2015
Mensajes: 10
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Buscar un n.º dentro de un texto

Me acabas de dar una idea

Código SQL:
Ver original
  1. locate(t.id, u.text)  && (t.text LIKE 'naranjas')

Última edición por gnzsoloyo; 18/12/2015 a las 05:30
  #8 (permalink)  
Antiguo 18/12/2015, 05:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Buscar un n.º dentro de un texto

Es una mala idea, y además es evidente que necesitas estudiar mucho más de SQL...
Mira, LIKE es una de las peores cláusulas que existen, y no es un comodín multiuso. El algoritmo interno de LIKE está diseñado para realizar búsquedas basadas en patrones, y NO para validar igualdades. No es lo mismo.
Usar un LIKE sin comodines (%) es un error porque obliga al parser a realizar modificaciones innecesarias en la lógica del plan de consulta.
Por su lado, LOCATE() también es una función ineficiente, que apunta a buscar un patrón dentro de una cadena, y tampoco está definida para manejar escalares (números). Esto se empeora debido a que una comparación de LOCATE obligatoriamente verificará el conjunto completo de segmentos posibles de un campo de caracteres, basado en la longitud de la cadena que se busca. El resultado de eso puede tener una performance espantosa, sin contar con su inseguridad, porque si buscases un valor como por ejemplo "35", puede devolverte aquellos que contengan, por ejemplo, 35, 135, 351, 121212235987876, o cualquier cosa así.
¿Te parece conveniente?
Obviamente es una muy mala decisión.


NO.
Yo te dije claramente que lo que debes hacer, si no quieres corregir ese error enorme de diseño en tus tablas y procesos, que lo que debes hacer es usar la función FIND_IN_SET(), para lo cual solamente tienes que acudir al manual de referencia (ver FIND_IN_SET()), donde claramente se expresa, por ejemplo, que está optimizada para aritmética de bits, lo que es fundamental porque los números se administran internamente en los DBMS como binarios, no como cadenas de texto:
Cita:
the FIND_IN_SET() function is optimized to use bit arithmetic
En resumen, si quieres seguir con ese esquema mal diseñado (no es el unico error que contiene), tendrás que usar funciones de cadena. Y estas las deberás estudiar en el manual. Pero si quieres realmente resolver tus problemas presentes o futuros, debes modificar ese esquema de bases de datos y diseñarlo bien.
Hacer esto ultimo te ahorrará muchos sufrimientos y tiempo, y te permitirá hacer consultas optimizadas, eficientes, que en el esquema actual será imposible.

Es tu decisión.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 18/12/2015, 16:09
 
Fecha de Ingreso: diciembre-2015
Mensajes: 10
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Buscar un n.º dentro de un texto

Tomo nota.

Gracias por las aportaciones.

Etiquetas: select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:57.