Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/04/2014, 05:38
Avatar de gnzsoloyo
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: Esto es posible (score en inner join)

Cita:
He comprobado todo, y la sentencia es correcta, en teoría los campos deberían de ser fulltext (comprobado por enésima vez).
Los campos no son FULLTEXT, en todo caso puedes tener índices FULLTEXT, que no es exactamente lo mismo. Y sólo aplicaría si son tablas InnoDB... ¿Lo son, no?
Cita:
Estoy revisando las bases de datos, pero me da un error en el que pone incorrect arguments to match.
Cita:
La sentencia que puse yo arriba funciona perfectamente.
O una cosa o la otra. Si estuviese bien escrita no te daría ese error.

Vamos por partes.
En primer lugar vamos a limpiar la query tratando de que sea más legible:
Código MySQL:
Ver original
  1. FROM universo U INNER JOIN universo_etiquetas UE ON U.universo_id = UE.universo_id
  2.     MATCH (UE.etiqueta,U.descripcion) AGAINST ("%compis trbajo%" IN BOOLEAN MODE)
  3.     OR U.categoria LIKE "%compis trbajo%" OR U.descripcion LIKE "%compis trbajo%"
  4.     OR UE.etiquetal LIKE "%compis trbajo%"
  5.     AND U.privacidad = 1
- En primer lugar, las comillas no funcionan para las cadenas de texto, a menos que se configure el servidor para que las tome. De lo contrario se interpretarán como delimitadores de nombres de objetos de la base, lo que puede generar errores de sintaxis de difícil detección.
- En segundo lugar, MATCH() AGAINST() no trabaja por aproximación, sino por recurrencia de palabras completas. Esto implica que no interpreta los comodines. No es semejante al LIKE, y no sigue las mismas reglas.
- En tercer lugar, la lógica del WHERE está mal, porque el OR es una disyunción, por lo que en realidad tienes tres condiciones independientes en esa consulta, y con que se cumpla una sola ya devolverá datos.
Esta es una
Código MySQL:
Ver original
  1. MATCH (UE.etiqueta,U.descripcion) AGAINST ("%compis trbajo%" IN BOOLEAN MODE)
Esta es otra
Código MySQL:
Ver original
  1. U.categoria LIKE "%compis trbajo%" OR U.descripcion LIKE "%compis trbajo%"
Y estas son una sola:
Código MySQL:
Ver original
  1. UE.etiquetal LIKE "%compis trbajo%"
  2. AND U.privacidad = 1
La sintaxis correcta sería algo como:
Código MySQL:
Ver original
  1. FROM universo U INNER JOIN universo_etiquetas UE ON U.universo_id = UE.universo_id
  2.     (MATCH (UE.etiqueta,U.descripcion) AGAINST ('compis trbajo' IN BOOLEAN MODE)
  3.     OR U.categoria LIKE '%compis trbajo%' OR U.descripcion LIKE '%compis trbajo%'
  4.     OR UE.etiquetal LIKE '%compis trbajo%')
  5.     AND U.privacidad = 1
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)