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

No doy con la sentencia adecuada

Estas en el tema de No doy con la sentencia adecuada en el foro de Mysql en Foros del Web. Hola a todos. Llevo unos días dándole vueltas a una sentencia que no consigo hacer funcionar. El caso es que tras importar unos foros los ...
  #1 (permalink)  
Antiguo 13/09/2012, 16:32
 
Fecha de Ingreso: febrero-2011
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 0
No doy con la sentencia adecuada

Hola a todos. Llevo unos días dándole vueltas a una sentencia que no consigo hacer funcionar. El caso es que tras importar unos foros los ids se me han vuelto algo locos, y me toca reorganizarlos partiendo de que tienen el título igual. El caso es que eso lo he conseguido sin mayor problemas con esto:

Código MySQL:
Ver original
  1. UPDATE vb2_post
  2. INNER JOIN vb2_thread
  3. ON `vb2_post`.`title`
  4. LIKE vb2_thread.title
  5. SET `vb2_post`.`threadid` = `vb2_thread`.`threadid`
  6. vb2_post.postid = 1586445

El caso es simple, comparo los títulos y si coinciden a vb2_post.threadid se le asigna el threadid válido de vb2_thread.
Ahora mi problema viene cuando quiero utilizar comodines ya que muchos de los títulos de las repuestas llevan un Re: delante del title. Por lo cual necesito que el LIKE lo haga con comodín, resumiendo, he intentado esto pero no sale:

Código MySQL:
Ver original
  1. UPDATE vb2_post
  2. INNER JOIN vb2_thread
  3. ON `vb2_post`.`title`
  4. LIKE '%vb2_thread.title%'
  5. SET `vb2_post`.`threadid` = `vb2_thread`.`threadid`
  6. vb2_post.postid = 1586445

Esto evidentemente toma como comodín vb2_thread.title como tal no el texto de dentro de esta tabla. Alguna sugerencia para usar el comodín con una tabla?

GRACIAS.

Un saludo.
  #2 (permalink)  
Antiguo 13/09/2012, 20:36
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, 5 meses
Puntos: 2658
Respuesta: No doy con la sentencia adecuada

En primer lugar, usar LIKE en una consolidación de datos como la que propones, se considera una pésima práctica, porque puede dar lugar a errores de identidad. COmo LIKE funciona por aproximación, el resultado puede no ser el deseado..

Por otro lado, el hecho de que tengas un "RE:", al inicio de la cadena es medio irrelevante, simplemente podrías eliminarlo de la búsqueda y listo:
Código MySQL:
Ver original
  1. UPDATE vb2_post JOIN vb2_thread ON `vb2_post`.`title` = TRIM(REPLACE(vb2_thread.title, 'RE:', ''))
  2. SET `vb2_post`.`threadid` = `vb2_thread`.`threadid`
  3. WHERE vb2_post.postid = 1586445
(eliminé el LIKE porque en el contexto de tu consula es semánticamente equivalente al "=", pero implica un algoritmo menos eficiente)
También se podría escribir, y mejor:
Código MySQL:
Ver original
  1. UPDATE vb2_post JOIN vb2_thread
  2. SET `vb2_post`.`threadid` = `vb2_thread`.`threadid`
  3.     `vb2_post`.`title` = TRIM(REPLACE(vb2_thread.title, 'RE:', ''))
  4.     AND vb2_post.postid = 1586445

Finalmente, cuando quieres usar un LIKE contra el contenido de un campo, no puedes poner el campo en la cadena, porque deja de ser un campo, y pasa a ser la cadena con el nombre del campo.
Para que eso resulte tienes que encadenar el contenido a los comodines:
Código MySQL:
Ver original
  1. UPDATE vb2_post JOIN vb2_thread
  2. SET `vb2_post`.`threadid` = `vb2_thread`.`threadid`
  3.     `vb2_post`.`title` LIKE CONCAT('%', vb2_thread.title, '%')
  4.     AND vb2_post.postid = 1586445
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/09/2012, 16:45
 
Fecha de Ingreso: febrero-2011
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: No doy con la sentencia adecuada

Muchas gracias gnzsoloyo, estuve probando y no me funcionaron, se ejecutaban correctamente pero no me cambiaba nada.
Al final, como no eran más que unas 10000 consultas, lo que hice fue filtar, luego exportar los títulos de los threads, renombrarlos con el notepad++ y volverlos a subir a un campo nuevo. En poco lioso pero me resultó, además al no tener que está haciendo consultas a la tabla de thread que tenía ~200K campos, me iba muchísimo más rápido.

Muchas gracias de todas formas por la ayuda.

Un saludo.
  #4 (permalink)  
Antiguo 16/09/2012, 17:29
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, 5 meses
Puntos: 2658
Respuesta: No doy con la sentencia adecuada

Hubiera sido interesante que postearas un ejemplo de los datos que tenías, para ver si la consulta estaba realmente bien hecha, podía hacerse de un mejor modo.
Nunca te quedes con la primera solución incorrecta. Acá solemos darle seguimiento al problema, porque eventualmente las soluciones le servirán a alguien mas.
Corregir el inconveniente por "fuerza bruta" (así se denomina ese tipo de soluciones), puede haberte sacado del atolladero, pero hubieras aprendido más SQL si lo hubiésemos podido resolver con más análisis.
Tenlo en cuenta para otra ocasión.

Saludos
__________________
¿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/09/2012, 00:48
 
Fecha de Ingreso: febrero-2011
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: No doy con la sentencia adecuada

Tienes toda la razón, pero bueno soy webmaster de un grupo de foros y la verdad tengo que usar este tipo de cosas muy muy esporadicamente ya que habitualmente trato más temas de configuración de servidor y de los propios foros. Pese a eso creo que la solución que tomé era, sin quererlo, la más apropiada ya que como te dije hacer las consultas sobre una tabla con ~10K de registros es infinitamente más rápido que hacerlo sobre la original con más de 200K de registros.
Muchas gracias por el interés. No dudes que si me vuelve a fallar algo así no pararé hasta dar con la sentencia adecuada.

Un saludo compañero.

Etiquetas: join, sentencia, 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 23:18.