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

[SOLUCIONADO] Esto es posible (score en inner join)

Estas en el tema de Esto es posible (score en inner join) en el foro de Mysql en Foros del Web. Muy buenas, lo primero gracias por vuestro tiempo, mi duda es si esta sentencia mysql podria generar un SCORE, yo he probado con lo que ...
  #1 (permalink)  
Antiguo 07/04/2014, 03:39
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Esto es posible (score en inner join)

Muy buenas, lo primero gracias por vuestro tiempo, mi duda es si esta sentencia mysql podria generar un SCORE, yo he probado con lo que entiendo donde deberia de ir pero no me esta funcionando.

la sentencia es:
Código SQL:
Ver original
  1. SELECT * FROM universo INNER JOIN universo_etiquetas ON universo.universo_id = universo_etiquetas.universo_id
  2. WHERE MATCH (universo_etiquetas.etiqueta,universo.descripcion) against ("%compis trbajo%" IN BOOLEAN mode)
  3. OR universo.categoria LIKE "%compis trbajo%" OR universo.descripcion LIKE "%compis trbajo%"
  4. OR universo_etiquetas.etiquetal LIKE "%compis trbajo%" AND universo.privacidad = 1
[/CODE]
he probado a ponerlo en mil sitios(segun otros ejemplos menos complejos) y soy incapaz de hacerlo funcionar.
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.

Última edición por gnzsoloyo; 07/04/2014 a las 04:25
  #2 (permalink)  
Antiguo 07/04/2014, 04:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Esto es posible (score en inner join)

Para que funcione el filtro match () AGAINTS () necesitas un indice full text definido sobre los campos que vas a usar, no podras definirlo sobre campos de tablas distintas....

http://dev.mysql.com/doc/refman/5.5/...xt-search.html
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 07/04/2014 a las 04:33
  #3 (permalink)  
Antiguo 07/04/2014, 04:40
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Respuesta: Esto es posible (score en inner join)

Estoy revisando las bases de datos, pero me da un error en el que pone incorrect arguments to match.

1 estoy mirando que todo sea full text y no de problemas.
2 revisar que todo este correctamente escrito.

pero si es otra cosa no se que puede ser.
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.
  #4 (permalink)  
Antiguo 07/04/2014, 04:59
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Respuesta: Esto es posible (score en inner join)

He comprobado todo, y la sentencia es correcta, en teoría los campos deberían de ser fulltext (comprobado por enésima vez).

Les he pasado la sentencia a los del hosting y todo para ver que puede ser, por que la verdad es que me esta tocando los...

La sentencia que puse yo arriba funciona perfectamente.

por lo que entiendo ya no entiendo nada...

no es mi primer buscador, si en el que tengo que cruzar tablas, pero eso lo he superado lo que no consigo es que me haga caso si quiero usar el SCORE.


Se aceptan ideas.
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.
  #5 (permalink)  
Antiguo 07/04/2014, 05:38
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: 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)
  #6 (permalink)  
Antiguo 07/04/2014, 08:12
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Respuesta: Esto es posible (score en inner join)

Si eso lo entiendo y era como yo mismo he creado la sentencia, primero 2 clausulas y luego las otras, pero lo que quisiera es que me haria un score(tambien acabo de entender que tendre separar las palabras en la busqueda de against para que lo haga mejor.

Yo lo unico que no sabia, y creo que sigo sin lograrlo aunque voy a repasar un poco más, era poner un SCORE para poder ordenarlo por el
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.
  #7 (permalink)  
Antiguo 07/04/2014, 08:26
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: Esto es posible (score en inner join)

Cita:
Iniciado por No-NaMe Ver Mensaje
Yo lo unico que no sabia, y creo que sigo sin lograrlo aunque voy a repasar un poco más, era poner un SCORE para poder ordenarlo por el
La verdad es que no estoy seguro de que hayas entendido lo que te dije...

No es un problema poner un "score". El problema es que estás redactando mal la consulta, y que las condiciones están puestas de forma tal que pueden darte resultados falsos...

¿Las tablas en cuestión, son o no son MyISAM?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 07/04/2014, 08:33
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Respuesta: Esto es posible (score en inner join)

Si son MyISAM, pero se pueden cambiar por cualquier otra,
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.

Última edición por No-NaMe; 07/04/2014 a las 08:39 Razón: añadir info.
  #9 (permalink)  
Antiguo 07/04/2014, 08:49
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: Esto es posible (score en inner join)

No puedes cambiarlas si quieres usar indices FULLTEXT.
Lo que debes tener claro es que la búsqueda con MATCH() AGAINST() se hace con palabras completas, por lo que no aplica similitud.
Ahora bien, la pregunta es ¿cómo evalúas ese "score"? ¿En base a qué, o qué calcula?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 07/04/2014, 09:01
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Respuesta: Esto es posible (score en inner join)

Yo sobre la sentencia arriba expuesta obtengo unos resultados, quiero que a partir de la compracion de match() against() el score resultante sea el que determine el orden.

La sentencia dará unos resultados, pero estos carecerían de orden "lógico" ya que se ordenarían o por orden de entrada, alfabeto o numero de id, para que tengan una razón de orden, me gustaría que se usara el match against, ya que así conseguiría que el orden fuera por algo relacionado con la búsqueda.
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.
  #11 (permalink)  
Antiguo 08/04/2014, 07:05
 
Fecha de Ingreso: marzo-2008
Ubicación: En casa
Mensajes: 252
Antigüedad: 16 años, 1 mes
Puntos: 4
Respuesta: Esto es posible (score en inner join)

Resolviendo el tema, lo que tenia mal planteado era la creacion de un unico score, ahora e creado desde esta nueva perspectiva el buscador y queda tal que asi para dar los resultados que yo queria y ordenarlos.

Codigo MySQL:

Código MySQL:
Ver original
  1. SELECT *,
  2.     MATCH(universo.descripcion) AGAINST('$busqueda') as tscore,
  3.     MATCH(universo_etiquetas.etiqueta) AGAINST('$busqueda') as ascore,
  4.     MATCH(universo.nombre_universo) AGAINST('$busqueda') as cscore
  5.     FROM universo
  6.     LEFT JOIN universo_etiquetas ON universo.universo_id = universo_etiquetas.universo_id
  7.     WHERE
  8.     universo.privacidad=1
  9.     OR universo.categoria LIKE '%$busqueda%'
  10.     OR universo_etiquetas.etiqueta LIKE '%$busqueda%'
  11.     ORDER BY (tscore + ascore + cscore) DESC

Gracias a todos por vuestro tiempor, en especial a gnzsoloyo que a sido quien me ha hecho las preguntas correctas para darme cuenta de mi error, espero que esto a alguien le sirva.
__________________
Ayudar cuesta mucho, dar las gracias no tanto, tenlo en cuenta siempre.

Etiquetas: join, posible, 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 13:45.