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

Problema al consultar con like

Estas en el tema de Problema al consultar con like en el foro de Mysql en Foros del Web. Hola a todos!!, estoy teniendo un problema con la consulta utilizando like, mediante la función explode() logré que el like pudiera aceptar la consulta de ...
  #1 (permalink)  
Antiguo 14/02/2012, 22:04
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Problema al consultar con like

Hola a todos!!, estoy teniendo un problema con la consulta utilizando like, mediante la función explode() logré que el like pudiera aceptar la consulta de más de 1 palabra.

Ahora el problema que tengo es que quiero encontrar el resultado llamado "La historia de google", al buscar "google" este resultado aparece en la primera página, pero cuando busco "historia de google" el resultado ya no aparece en la primera, y en cambio aparecen solo resultados de historia.

El problema es que si busco 2 o más palabras es que divide las palabras para dar distintos resultados, pero si un resultado contiene las dos palabras no lo toma en cuenta como para que este aparezca primero, el código es el siguiente:


Código PHP:
// un poco más arriba aparecen otros explode, pero no creo que eso sea lo importante 
$palabras=explode(' ',$frase);  
$condicion='';  
foreach (
$palabras as $palabra) {  
  if (
$condicion!=''$condicion.=' OR ';  
  
$condicion.="(webDescripcion LIKE '%$palabra%')";  

$sssqlmysql_query("SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords   
from 
((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 where  $condicion AND s1.webTitulo like '%$frase%') 
union 
(select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 where  $condicion1 AND s2.webkeywords like '%$frase%') 
union 
(select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 where  $condicion2 AND s3.webDescripcion like '%$frase%')) uDR 
order by uDR.priority "
$server_link)  

                              or die(
mysql_error()); 
Probé cambiar el OR por un AND, también crear un elseif ($condicion!='') $condicion.=' OR '; y que el if tuviera un AND, pero no funciono.

Alguien sabe como solucionar esto???. Saludos y gracias a todos!!
  #2 (permalink)  
Antiguo 15/02/2012, 02:22
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema al consultar con like

Código MySQL:
Ver original
  1. ...
  2. where  $condicion AND s1.webTitulo like '%$frase%'
  3. ....

Por que agregas detras de $condicion ese "AND s1.webTitulo like '%$frase%'" ?

Fijate lo que estas haciendo

X or Y or Z and XYZ

eso se interpreta así X or Y or (Z and XYZ) luego claro que no te da los resultados que buscas...

Recuerda que 2+3*5=2+(3*5) pero es distinto de (2+3)*5 con los operadores logicos pasa lo mismo

X or Y or Z and XYZ=X or Y or (Z and XYZ) y distinto de (X or Y or Z) and XYZ

en tu caso NO te sirve ninguna de las dos (con o sin parentesis).

Debes filtrar por $condicionX para cada campo ... y nunca filtrar por la frase entera.

Tambien prodias ir al principio y usar el MATCH AGAINST pero en cada una de las subconsultas del union y sobre un solo campo.... eso te ahorraria los explode.... En mi primer post sobre el tema interprete que buscabas $frase como cadena no como palabras independientes.

En esa query que nos mandas vas a tener repeticiones puesto que apesar de que UNION es igual a UNION DISTINCT por el campo priority siempre seran distintos....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 15/02/2012 a las 02:33
  #3 (permalink)  
Antiguo 15/02/2012, 12:21
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema al consultar con like

Hola quimfv, gracias por tu ayuda, estuve probando con match against pero me marca este erro:

Cita:
Can't find FULLTEXT index matching the column list
Aca esta el codigo con where match y against, también probé con macht against, pero marca el mismo error.

Código MySQL:
Ver original
  1. SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords    
  2. from  
  3. ((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 WHERE MATCH (webTitulo) AGAINST ('%$frase%'))  
  4. (select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 WHERE MATCH (webkeywords) AGAINST ('%$frase%'))  
  5. (select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 WHERE MATCH (webDescripcion) AGAINST ('%$frase%'))) uDR  
  6. order by uDR.priority

Con lo de condicion, como hago para aplicarlo al codigo, no entendi muy bien como es, debería reemplazar "LIKE '%$frase%' " por "LIKE '%$condicion%' " ??
  #4 (permalink)  
Antiguo 15/02/2012, 12:36
Avatar de timoteo666  
Fecha de Ingreso: agosto-2011
Ubicación: /home/Gdl
Mensajes: 242
Antigüedad: 12 años, 8 meses
Puntos: 11
Respuesta: Problema al consultar con like

Mira lee minusiosamente esto:

fulltext-boolean

aqui esta la respuesta que buscas..

Tambien puedes utilizar REGEXP pero tu decides, saludos.
__________________
( + ) lineas de código ( - ) televisión
  #5 (permalink)  
Antiguo 15/02/2012, 12:51
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema al consultar con like

Cita:
Iniciado por timoteo666 Ver Mensaje
Mira lee minusiosamente esto:

fulltext-boolean

aqui esta la respuesta que buscas..

Tambien puedes utilizar REGEXP pero tu decides, saludos.
Yo antes utilizaba busquedas full text, pero al estar alojado en un host, no puedo modificar los parametros mysql para que funcionen las busquedas de menos de 4 letras. Por eso decidí utilizar like, si puedo solucionar ese error que tengo funcionaria perfecto, porque ya logre que funcione con mas de 1 palabra y que tenga en cuenta solo palabras de 3 letras o más, para entregar mejores resultados.

Espero que puedan ayudarme con esto, porque es lo unico que me falta.

Saludos y gracias!!!

PD: acabo de probar añadirle IN BOOLEAN MODE, pero pasa que no funciona con palabras de menos de 4 letras, además los resultados siguen siendo similares a cuando usaba el like.

PD2: Si elimino el " AND s1.webTitulo like '%$frase%' " sigue estando el problema de que solo toma en cuenta una palabra para ordenarlos y si elimino solo lo de AND s1.webTitulo no me aparecen resultados cuando busco una sola palabra, y sigue el otro problema

Última edición por xarmagedonx; 15/02/2012 a las 14:53
  #6 (permalink)  
Antiguo 16/02/2012, 08:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema al consultar con like

order by uDR.priority

con esto solo ordena por priority debes poner los otros campos por los que quieras que ordene...

Cita:
Can't find FULLTEXT index matching the column list
Aqui te dice que no encuentra el indice FULL TEXT que le coincida la lista de columnas.


No uso nunca este tipo de indices ni de busquedas ya que trabajan con tabla myisam. Pero creo que el problema es que deberias tener creado un indice para cada grupo de campos sobre los que quieras hacer una busqueda.


Cita:
Si elimino el " AND s1.webTitulo like '%$frase%' " sigue estando el problema de que solo toma en cuenta una palabra para ordenarlos
Quitar una condicion del where no tiene ningun efecto sobre el order by. No sera que estas haciendo solo "order by uDR.priority " y deberías hacer "order by uDR.priority, uDR.t, uDR.d,uDR.w,uDR.k" o como minimo priority y titulo.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 16/02/2012 a las 08:40
  #7 (permalink)  
Antiguo 16/02/2012, 13:27
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema al consultar con like

el problema es que si hago un order by asi: "order by uDR.priority, uDR.t, uDR.d,uDR.w,uDR.k", no se porque siempre ordena alfabeticamente.

Lo que hice ahora para que al buscar con 2 palabras o mas no haya problemas, fue crear un if y un else, entonces si uno busca 1 palabra se busca con like, pero si uno busca mas de 1 palabra se utiliza match against.

Pero ahora como siempre aparece otro error diferente, no se si en algun momento voy a poder solucionarlos del todo jajaja.

Problema:

Ahora cuando hago una búsqueda, como por ejemplo "tornado y huracan" aparece algo muy extraño... los primeros resultados contienen números en el título, pero en ningún campo del resultado aparece ni la palabra tornado ni huracan, y algunos otros resultados que también aparecen y no contienen las palabras buscadas.

Les dejo el código para que vean que es lo que estoy haciendo, espero que puedan ayudarme a encontrar este error, porque la verdad que estoy completamente perdido, no se porque se produce:

Código MySQL:
Ver original
  1. // mas arriba hay otros explode casi iguales
  2. $palabras2=explode(' ',$frase);
  3. $condicion2='';
  4. foreach ($palabras2 as $palabra2) {
  5.   if ($condicion2!='') $condicion2.=' OR ';
  6.   $condicion2.="(webDescripcion)";
  7. }
  8. $cant_terminos = count(explode(" ", $terminos));
  9. if($cant_terminos == 1){
  10. $sssql= mysql_query("SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords  
  11. from
  12. ((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 where  $condicion LIKE '%$palabra%')
  13. union
  14. (select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 where  $condicion1 LIKE '%$palabra1%')
  15. union
  16. (select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 where  $condicion2 LIKE '%$palabra2%')) uDR
  17. order by uDR.priority ", $server_link)
  18.  
  19.                               or die(mysql_error());
  20. } else {      
  21.                              
  22. $sssql= mysql_query("SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords  
  23. from
  24. ((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 WHERE MATCH ($condicion) AGAINST ('$frase' IN BOOLEAN MODE))
  25. union
  26. (select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 WHERE MATCH ($condicion1) AGAINST ('$frase' IN BOOLEAN MODE))
  27. union
  28. (select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 WHERE MATCH ($condicion2) AGAINST ('$frase' IN BOOLEAN MODE))) uDR
  29. order by uDR.priority ", $server_link)
  30.  
  31.                               or die(mysql_error());
  32.   }

La verdad es que esto me hizo aprender bastante de php y mysql pero a este error no le encuentro una solucion posible... espero que logren encontrarlo.

Muchisimas gracias a todos los que me estan ayudando.

PD: Probe aplicando el order by uDR.priority, uDR.t, uDR.d,uDR.w,uDR.k pero sigue dando esos resultados extraños

Última edición por xarmagedonx; 16/02/2012 a las 13:34
  #8 (permalink)  
Antiguo 17/02/2012, 02:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema al consultar con like

Cita:
el problema es que si hago un order by asi: "order by uDR.priority, uDR.t, uDR.d,uDR.w,uDR.k", no se porque siempre ordena alfabeticamente.
???

Si tienes

priority- t
2---------A
1---------B

order by uDR.priority, uDR.t

dará siempre

1-------B
2-------A


$condicion2.="(webDescripcion)";

ese parentesis sobra.


Haz un print de la sentencia SQL

echo "SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords
from
((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 where $condicion LIKE '%$palabra%')
union
(select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 where $condicion1 LIKE '%$palabra1%')
union
(select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 where $condicion2 LIKE '%$palabra2%')) uDR
order by uDR.priority;"."<br>";

Para ver que es lo que esta mandando al servidor...

Si has creado los indices FULL TEXT deberian funcionar tanto para una como para n palabras...

Porque usas $palabra, $palabra1, $palabra2.... este lado de la condion siempre debe ser el mismo no?

(Cierto así se aprende mucho, como reza la firma de algun ilustre miembro del foro se aprende mas de los errores que de los aciertos)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #9 (permalink)  
Antiguo 17/02/2012, 14:00
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema al consultar con like

Probé haciendo el print con el echo y me apareció esto:

Código MySQL:
Ver original
  1. SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords from ((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 where webTitulo OR webTitulo OR webTitulo LIKE '%huracan%') union (select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 where webkeywords OR webkeywords OR webkeywords LIKE '%huracan%') union (select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 where webDescripcion OR webDescripcion OR webDescripcion LIKE '%huracan%')) uDR order by uDR.priority;

No entiendo porque solo toma en cuenta huracan, también probé cambiando el like así:

LIKE '%$terminos%' pero el error seguia siendo el mismo.

Aca también probé haciendo el print con el match against

Código MySQL:
Ver original
  1. SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords from ((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 WHERE MATCH (webTitulo OR webTitulo OR webTitulo) AGAINST ('tornado y huracan' IN BOOLEAN MODE)) union (select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 WHERE MATCH (webkeywords OR webkeywords OR webkeywords) AGAINST ('tornado y huracan' IN BOOLEAN MODE)) union (select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 WHERE MATCH (webDescripcion OR webDescripcion OR webDescripcion) AGAINST ('tornado y huracan' IN BOOLEAN MODE))) uDR order by uDR.priority;

Ahí parece como si estuviera todo bien, pero sigue el mismo error, tengo los indices full text creados, también probe agregando al order by el , uDR.t pero nada lo hace funcionar, aparecen resultados que no contienen las palabras buscadas y no entiendo porque.

Borre los parentesis, y cambie $palabra1 y 2 por $palabra

Saludos

Última edición por xarmagedonx; 17/02/2012 a las 14:07
  #10 (permalink)  
Antiguo 20/02/2012, 12:02
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema al consultar con like

Hola de nuevo!, ya estoy hace varios días intentando solucionar esto y no lo logro, alguien sabe como solucionar este error??.

Saludos y gracias
  #11 (permalink)  
Antiguo 20/02/2012, 12:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema al consultar con like

WHERE webTitulo OR webTitulo OR webTitulo LIKE '%huracan%'

El echo te muestra que no se esta construyendo bien la sentencia sql, tu problema esta en php no en sql.

Cuando consigas una sentencia sql que tenga sentido luego analiza si hace lo que quieres....

$condicion2.="(webDescripcion)"; en esta linea falta algo no? Le tendrás que poner algo mas que el nombre del campo.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: consultar, query, select, sql
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 01:53.