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

[SOLUCIONADO] Ordenar registros con instr()

Estas en el tema de Ordenar registros con instr() en el foro de Mysql en Foros del Web. Hola!!, tengo una duda con respecto a como ordenar registros con la función instr. Encontré el siguiente código: Código: ORDER BY IF(INSTR(webTitulo, 'recetas de cocina'), ...
  #1 (permalink)  
Antiguo 01/04/2013, 17:04
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 3
Ordenar registros con instr()

Hola!!, tengo una duda con respecto a como ordenar registros con la función instr.

Encontré el siguiente código:

Código:
ORDER BY IF(INSTR(webTitulo, 'recetas de cocina'), INSTR(webTitulo, 'recetas de cocina'), 65535)
Lo que hace este código es ordenar los registros que contengan la frase buscada más cerca del inicio, en este caso "recetas de cocina".

Si lo reemplazo por mi actual order by, funciona perfecto me ordena por distancia de la palabra buscada en el título, pero deja inservible a el algoritmo anterior.

Quisiera poder combinar a ambos algoritmos, les muestro el actual:

Código MySQL:
Ver original
  1. SELECT uDR.webTitulo, uDR.webDescripcion, uDR.webkeywords, uDR.weburl, SUM(uDR.priority) as SPriority
  2.  
  3. (SELECT s1.webTitulo, s1.webDescripcion, s1.weburl, s1.webkeywords, 4 as priority FROM webs s1 WHERE MATCH (webTitulo) AGAINST ('recetas de cocina'))
  4.  
  5.  
  6. (SELECT s2.webTitulo, s2.webDescripcion, s2.weburl, s2.webkeywords, 2 as priority FROM webs s2 WHERE MATCH (webkeywords) AGAINST ('recetas de cocina*' IN BOOLEAN MODE))
  7.  
  8.  
  9. (SELECT s3.webTitulo, s3.webDescripcion, s3.weburl, s3.webkeywords, 1 as priority FROM webs s3 WHERE MATCH (webDescripcion) AGAINST ('recetas de cocina'))
  10.  
  11.  
  12. (SELECT s4.webTitulo, s4.webDescripcion, s4.weburl, s4.webkeywords, 1 as priority FROM webs s4 WHERE MATCH (weburl) AGAINST ('recetas de cocina))) uDR
  13.  
  14. GROUP BY uDR.webTitulo, uDR.weburl, uDR.webDescripcion, uDR.webkeywords
  15.  
  16. ORDER BY SPriority DESC

¿Cómo puedo lograr combinar ambos algoritmos? intenté con un AND pero lo único que produce es que no se muestren los resultados, y otra duda que me surgió es ¿Cómo puedo utilizar instr() para la descripcion y keywords?.

Saludos y gracias a todos los que me ayuden!
__________________
Naica enciclopedia animal
  #2 (permalink)  
Antiguo 02/04/2013, 08:58
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ordenar registros con instr()

Hola Naica:

No entiendo bien a qué te refieres con eso de "combinar a ambos algoritmos", supongo que lo que intentas hacer es utilizar dos criterios de ordenación, es correcto?

Vayamos por partes, la ordenación se realiza de manera jerárquica es decir, puedes colocar distintos criterios o campos, separados por comas:

Código:
ORDER BY campo1, campo2, INSTR(cadena, 'ALGO')....
Esto quiere decir que los registros se ordenarán en primer lugar por el campo1, una vez ordenados todos los registros por este campo se procederá a ordenar por el campo2 y así sucesivamente... observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------+--------+--------+
  3. | id   | campo1 | campo2 | campo3 |
  4. +------+--------+--------+--------+
  5. |    1 |      1 |     10 | a      |
  6. |    2 |      2 |      9 | b      |
  7. |    3 |      3 |      5 | c      |
  8. |    4 |      1 |      9 | d      |
  9. |    5 |      2 |      4 | e      |
  10. |    6 |      3 |      1 | f      |
  11. |    7 |      1 |      2 | g      |
  12. |    8 |      2 |      3 | h      |
  13. |    9 |      3 |      5 | i      |
  14. +------+--------+--------+--------+
  15. 9 rows in set (0.00 sec)
  16.  
  17. mysql> SELECT * FROM tabla ORDER BY campo1, campo2, campo3;
  18. +------+--------+--------+--------+
  19. | id   | campo1 | campo2 | campo3 |
  20. +------+--------+--------+--------+
  21. |    7 |      1 |      2 | g      |
  22. |    4 |      1 |      9 | d      |
  23. |    1 |      1 |     10 | a      |
  24. |    8 |      2 |      3 | h      |
  25. |    5 |      2 |      4 | e      |
  26. |    2 |      2 |      9 | b      |
  27. |    6 |      3 |      1 | f      |
  28. |    3 |      3 |      5 | c      |
  29. |    9 |      3 |      5 | i      |
  30. +------+--------+--------+--------+
  31. 9 rows in set (0.00 sec)

De primera vista podrías pensar que los datos de la columna tres están desordenados, pero no es así, sino que dependen de los dos primeros campos... En los últimos dos registros, al haber paridad en los dos primeros criterios de ordenación entonces si se ordena por el campo3.

Ahora, volviendo a tu caso, no sé qué es exactamente lo que pretendes, pero podrías hacerlo así:

Código MySQL:
Ver original
  1. SELECT uDR.webTitulo, uDR.webDescripcion, uDR.webkeywords, uDR.weburl, SUM(uDR.priority) AS SPriority
  2. (  SELECT s1.webTitulo, s1.webDescripcion, s1.weburl, s1.webkeywords, 4 AS priority FROM webs s1 WHERE MATCH (webTitulo) AGAINST ('recetas de cocina')
  3.    UNION
  4.    SELECT s2.webTitulo, s2.webDescripcion, s2.weburl, s2.webkeywords, 2 AS priority FROM webs s2 WHERE MATCH (webkeywords) AGAINST ('recetas de cocina*' IN BOOLEAN MODE)
  5.    UNION
  6.    SELECT s3.webTitulo, s3.webDescripcion, s3.weburl, s3.webkeywords, 1 AS priority FROM webs s3 WHERE MATCH (webDescripcion) AGAINST ('recetas de cocina')
  7.    UNION
  8.    SELECT s4.webTitulo, s4.webDescripcion, s4.weburl, s4.webkeywords, 1 AS priority FROM webs s4 WHERE MATCH (weburl) AGAINST ('recetas de cocina')
  9. ) uDR
  10. GROUP BY uDR.webTitulo, uDR.weburl, uDR.webDescripcion, uDR.webkeywords
  11. ORDER BY SPriority DESC, IF(INSTR(uDR.webTitulo, 'recetas de cocina'), INSTR(uDR.webTitulo, 'recetas de cocina'), 65535)

Tu consulta tenía paréntesis completamente inutiles, además de algunos errores con las comillas simples, dale un vistazo para ver si es lo que necesitas y si no es así, postea algunos datos de ejemplo y que es lo que esperas como salida para poder tratar de ayudarte.

Saludos
Leo.
  #3 (permalink)  
Antiguo 02/04/2013, 11:04
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Ordenar registros con instr()

Hola leonardo, muchas gracias por responder, explico mejor que es lo que intento hacer.

Actualmente el algoritmo que utilizo es ineficiente, ya que muestra mucha cantidad de resultados irrelevantes. Intento mejorarlo un poco de la siguiente manera:

Quiero ordenar a los resultados de acuerdo en donde se encuentre la palabra buscada (en este caso "Recetas de cocina"), si la palabra se encuentra más cerca del inicio del titulo, tendrá una mejor posición que un registro que contenga la palabra al inicio de la descripcion o keywords.

Por ejemplo si busco "Recetas de cocina" quisiera que los resultados se ordenen de la siguiente manera:

Cita:
Recetas de cocina y mucho más.
Todos sobre recetas de cocina.

2° Distintos países y sus recetas de cocina.
Las recetas de cocina de los distintos países.

3° Viajes por el mundo
Recetas de cocina de todo el mundo
Creo que de esta manera lograría una mejora en la entrega de los registros.

El problema de los resultados ineficientes radica en el IN BOOLEAN MODE, pero si lo elimino no se podrán buscar palabras de 3 letras o menos como "Sol", "Adn". No puedo editar el "ft_min_word_len" porque no tengo dinero como para contratar un VPS.

Muchas gracias por la ayuda, por ahora funciona bien, ¿para incluir la descripción también debería hacer algo así?:

Código MySQL:
Ver original
  1. ORDER BY SPriority DESC, IF(INSTR(uDR.webTitulo, 'recetas de cocina'), INSTR(uDR.webTitulo, 'recetas de cocina'), 65535) ASC, IF(INSTR(uDR.webDescripcion, 'recetas de cocina'), INSTR(uDR.webDescripcion, 'recetas de cocina'), 65535) ASC
__________________
Naica enciclopedia animal
  #4 (permalink)  
Antiguo 02/04/2013, 12:19
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ordenar registros con instr()

Hola de nuevo Naica,

Te repito nuevamente lo de que ponerlos con comas indica una jerarquía, no sé si en este caso sea lo que tu quieres hacer, sin embargo en el IF si puedes hacer condiciones OR o AND, tantas como necesites, podrías hacer algo más o menos así:

Código MySQL:
Ver original
  1. ORDER BY SPriority DESC, ORDER BY
  2.   IF(INSTR(titulo, 'recetas de cocina') OR INSTR(descripcion, 'recetas de cocina'),
  3.      IF(INSTR(titulo, 'recetas de cocina'), INSTR(titulo, 'recetas de cocina'), INSTR(descripcion, 'recetas de cocina')), 65535)

Es decir, anidar las condiciones en lugar de separarlas por comas... Pero insisto, esto depende de tu lógica y de lo que quieras hacer.

Saludos
Leo.

Etiquetas: registros, select
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 20:44.