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 originalFROM universo U
INNER JOIN universo_etiquetas UE
ON U.universo_id
= UE.universo_id
MATCH (UE.etiqueta
,U.descripcion
) AGAINST
("%compis trbajo%" IN BOOLEAN MODE
) OR U.categoria
LIKE "%compis trbajo%" OR U.descripcion
LIKE "%compis trbajo%" OR UE.etiquetal
LIKE "%compis trbajo%"
- 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
Esta es otra
Y estas son una sola:
La sintaxis correcta sería algo como:
Código MySQL:
Ver originalFROM universo U
INNER JOIN universo_etiquetas UE
ON U.universo_id
= UE.universo_id
(MATCH (UE.etiqueta
,U.descripcion
) AGAINST
('compis trbajo' IN BOOLEAN MODE
) OR U.categoria
LIKE '%compis trbajo%' OR U.descripcion
LIKE '%compis trbajo%' OR UE.etiquetal
LIKE '%compis trbajo%')