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

Falla MATCH AGAINST con UNION

Estas en el tema de Falla MATCH AGAINST con UNION en el foro de Mysql en Foros del Web. Tengo la siguiente consulta que falla sólo cuando uso AS relevancia: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original ( SELECT * FROM libros WHERE keywords LIKE ...
  #1 (permalink)  
Antiguo 04/12/2013, 11:10
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Falla MATCH AGAINST con UNION

Tengo la siguiente consulta que falla sólo cuando uso AS relevancia:

Código MySQL:
Ver original
  1. (SELECT * FROM libros WHERE keywords LIKE '%$busqueda%' ORDER BY precio DESC, fecha ASC)
  2.  
  3.  
  4. (SELECT *, MATCH (keywords) AGAINST('$busqueda') AS relevancia FROM libros WHERE MATCH(keywords)
  5. AGAINST('$busqueda') ORDER BY relevancia DESC, ventas ASC, volumen DESC)

Ya sé que MySQL lo ordena automáticamente por relevancia pero necesito usar AS relevancia porque necesito ejecutar esa relevancia en primer lugar y en segundo lugar otras como se puede ver en el código.
  #2 (permalink)  
Antiguo 04/12/2013, 11:16
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: Falla MATCH AGAINST con UNION

Cita:
Ya sé que MySQL lo ordena automáticamente por relevancia pero necesito usar AS relevancia porque necesito ejecutar esa relevancia en primer lugar y en segundo lugar otras como se puede ver en el código.
¿Y para qué pones AS? Pon simplemente el alias.
Código SQL:
Ver original
  1. (SELECT *
  2. FROM libros
  3. WHERE keywords LIKE '%$busqueda%'
  4. ORDER BY precio DESC, fecha ASC)
  5. UNION
  6. (SELECT *, (MATCH (keywords) AGAINST('$busqueda')) relevancia
  7. FROM libros
  8. WHERE MATCH(keywords) AGAINST('$busqueda')
  9. ORDER BY relevancia DESC, ventas ASC, volumen DESC)
Eso, siempre que recuerdes que si o sí ambas consultas deben devolver la misma cantidad de campos, o de lo contrario generará un error de ejecución...
__________________
¿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 04/12/2013, 11:32
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Falla MATCH AGAINST con UNION

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Y para qué pones AS? Pon simplemente el alias.
Código SQL:
Ver original
  1. (SELECT *
  2. FROM libros
  3. WHERE keywords LIKE '%$busqueda%'
  4. ORDER BY precio DESC, fecha ASC)
  5. UNION
  6. (SELECT *, (MATCH (keywords) AGAINST('$busqueda')) relevancia
  7. FROM libros
  8. WHERE MATCH(keywords) AGAINST('$busqueda')
  9. ORDER BY relevancia DESC, ventas ASC, volumen DESC)
Eso, siempre que recuerdes que si o sí ambas consultas deben devolver la misma cantidad de campos, o de lo contrario generará un error de ejecución...

La segunda consulta crea una columna virtual llamada relevancia en la que se muestra la cifra de relevancia que la primera no tiene ¿Puede ser ese el fallo?

Por otro lado quiero aclarar que el primer SELECT en el UNION está puesto en primer lugar con la intención de que esos resultados salgan primero.
  #4 (permalink)  
Antiguo 04/12/2013, 11: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: Falla MATCH AGAINST con UNION

Cita:
¿Puede ser ese el fallo?
Precisamente eso es lo que te estoy diicendo. Si lees en el manual de referencia de MySQL (y de cualquier DBMS) verás que es condición obligatoria que todas las consultas unidas con una cláusula UNION deben devolver la misma cantidad de registros.
No es opcional. Si o sí.

Genera una columna falsa con un valor cero o uno para esa columna y listo.
__________________
¿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 04/12/2013, 12:04
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Falla MATCH AGAINST con UNION

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Precisamente eso es lo que te estoy diicendo. Si lees en el manual de referencia de MySQL (y de cualquier DBMS) verás que es condición obligatoria que todas las consultas unidas con una cláusula UNION deben devolver la misma cantidad de registros.
No es opcional. Si o sí.

Genera una columna falsa con un valor cero o uno para esa columna y listo.

No me funciona. He probado 2 cosas:

Usando SELECT *, NULL en el primer SELECT y creando una nueva columna en MySQL llamada relevancia (de tipo TEXT) sin ningún valor dentro.
  #6 (permalink)  
Antiguo 04/12/2013, 12: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, 4 meses
Puntos: 2658
Respuesta: Falla MATCH AGAINST con UNION

Cita:
No me funciona.
Como información para ayudarte, es insuficiente...

¿Qué no funciona?
¿Error de sintaxis?
¿Error de ejecución?
¿No devuelve datos?
¿Qué?

Si quieres ayudas que sirvan, debes darnos detalles que nos sirvan para saber qué estás viendo tu. Nosotros desde acá no lo sabemos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 04/12/2013, 12:55
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Falla MATCH AGAINST con UNION

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Como información para ayudarte, es insuficiente...

¿Qué no funciona?
¿Error de sintaxis?
¿Error de ejecución?
¿No devuelve datos?
¿Qué?

Si quieres ayudas que sirvan, debes darnos detalles que nos sirvan para saber qué estás viendo tu. Nosotros desde acá no lo sabemos.
Disculpa. Estoy repasando todo el código. Me he fijado que en el momento que meto MATCH AGAINST en cualquier UNION me lo ordena por la columna que sea PRIMARY KEY en MySQL sin que eso se indique en el código en ningún momento. De hecho no me responde a los ORDER BY que le pongo ya sean ASC, DESC o lo que sea. ¿Puede que por ser PRIMARY KEY le otorgue mayor prioridad obligatoria?
  #8 (permalink)  
Antiguo 04/12/2013, 13:03
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: Falla MATCH AGAINST con UNION

Puede ser, desde el momento en que el UNION, solo, intenta hacer un matching entre los dos resultados para descartar registros duplicados.
Si quieres que se encadene sin realizar ese matching deberías usar UNION ALL.
Por otro lado, estás usando el asterisco, una de las peores formas de consulta. Sería preferible que invocaras uno a uno los campos que efectivamente usarás, aunqu eeso implique listarlos todos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: falla, match, select, sql, union
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 21:34.