Foros del Web » Programando para Internet » PHP »

Ordenar registros por distancia PHP y MySQL

Estas en el tema de Ordenar registros por distancia PHP y MySQL en el foro de PHP en Foros del Web. Hola a todos!, tengo una duda con respecto a como ordenar los registros por distancia de la palabra buscada mediante php y mysql. Estos son ...
  #1 (permalink)  
Antiguo 01/04/2013, 11:44
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 3
Ordenar registros por distancia PHP y MySQL

Hola a todos!, tengo una duda con respecto a como ordenar los registros por distancia de la palabra buscada mediante php y mysql.

Estos son los pasos que iba a hacer:

1) Calcular mediante alguna función a partir de que número de caracteres en el texto se encuentra la palabra buscada.
2) Guardar el número que entrege en una variable.
3) Si el valor de la variable es menor o igual a 20 se ordena el registro en los primeros lugares.

Osea que si hay algún registro que tenga en 20 o menos caracteres la palabra buscada se va a ordenar primero, luego vendrán los registros que no tengan la palabra en esta distancia.

¿Alguien podría ayudarme? Saludos!!!!
__________________
Naica enciclopedia animal
  #2 (permalink)  
Antiguo 01/04/2013, 11:56
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 9 meses
Puntos: 181
Respuesta: Ordenar registros por distancia PHP y MySQL

¿Quieres explicarlo con un ejemplo de tipo práctico? personalmente yo no entendi la pregunta.
__________________
Blog de humor http://elcuasatar.net63.net/
  #3 (permalink)  
Antiguo 01/04/2013, 11:59
 
Fecha de Ingreso: abril-2008
Ubicación: El Salvador
Mensajes: 736
Antigüedad: 16 años
Puntos: 47
Respuesta: Ordenar registros por distancia PHP y MySQL

Tampoco entendi...
  #4 (permalink)  
Antiguo 01/04/2013, 14:24
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Ordenar registros por distancia PHP y MySQL

Claro, les explico mejor:

Hagamos de cuenta que soy un usuario, y quiero buscar "Recetas de cocina", los resultados que deberian aparecerme son:

Recetas de cocina
2º Todo sobre recetas de cocina
3º Carnes, pescados, frutas y distintas recetas de cocina

Intento que aparezcan primero los resultados que contengan la palabra buscada más cerca del inicio del texto, en el ejemplo se encuentra primero "recetas de cocina" que contiene la palabra clave desde el principio, el último resultado es el que contiene la palabra clave al final.

¿Cómo puedo lograr esto con PHP y MySQL

Saludos!
__________________
Naica enciclopedia animal
  #5 (permalink)  
Antiguo 01/04/2013, 14:38
 
Fecha de Ingreso: abril-2008
Ubicación: El Salvador
Mensajes: 736
Antigüedad: 16 años
Puntos: 47
Respuesta: Ordenar registros por distancia PHP y MySQL

Bueno si eso es lo que quieres hacer los pasos que describiste la inicio me parecen logicos, nose si sea la mejor forma de hacerlo pero creo que tiene logica...

Te agradeceremos que postees la solución
  #6 (permalink)  
Antiguo 01/04/2013, 14:56
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 9 meses
Puntos: 181
Respuesta: Ordenar registros por distancia PHP y MySQL

Yo lo haria de la siguiente manera:

Yo haria la consulta con el like de toda la vida:

Código MySQL:
Ver original
  1. select * from recetas where texto like '%recetas de cocina%'

Luego con ese arreglo que obtengas puedes recorrerlo y con la función stripos mirar la posición en que fue encontrada la palabra y se lo añades como un dato adicional a tu arreglo.

http://www.php.net/manual/es/function.stripos.php

Ordenas el arreglo, mira cual función te serviria para el caso en concreto.

http://php.net/manual/es/array.sorting.php

Por favor coloca tu solución una vez lo logres.

p.s. Mira en la documentación de mysql esto, quizas te sea de utilidad. De hecho me parece mucho mejor que lo que quieres realizar.

http://dev.mysql.com/doc/refman/5.0/...xt-search.html
__________________
Blog de humor http://elcuasatar.net63.net/

Última edición por cuasatar; 01/04/2013 a las 16:05
  #7 (permalink)  
Antiguo 01/04/2013, 16:14
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Ordenar registros por distancia PHP y MySQL

Gracias por la respuesta Cuasatar, busqué un símil a stripos en MySQL y encontré la función INSTR.

Puedo hacer el order by y que se ordenen por posición en el título, pero no puedo implementarlo bien, este es el código que encontré:

Código MySQL:
Ver original
  1. ORDER BY IF(instr(webTitulo, '$frase'), instr(webTitulo, '$frase'), 65535)

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, te muestro el actual:

Código MySQL:
Ver original
  1. $sqlBuscar = $server_link->query("SELECT uDR.webTitulo, uDR.webDescripcion, uDR.webkeywords, uDR.weburl, SUM(uDR.priority) as SPriority
  2. FROM (
  3.  
  4. (SELECT s1.webTitulo, s1.webDescripcion, s1.weburl, s1.webkeywords, $a as priority FROM webs s1 WHERE MATCH (webTitulo) AGAINST ('$frase'))
  5.  
  6. UNION
  7.  
  8. (SELECT s2.webTitulo, s2.webDescripcion, s2.weburl, s2.webkeywords, $b as priority FROM webs s2 WHERE MATCH (webkeywords) AGAINST ('$frase*' IN BOOLEAN MODE))
  9.  
  10.  
  11.  
  12. UNION
  13.  
  14. (SELECT s3.webTitulo, s3.webDescripcion, s3.weburl, s3.webkeywords, $c as priority FROM webs s3 WHERE MATCH (webDescripcion) AGAINST ('$frase'))
  15.  
  16. UNION
  17.  
  18. (SELECT s4.webTitulo, s4.webDescripcion, s4.weburl, s4.webkeywords, $d as priority FROM webs s4 WHERE MATCH (weburl) AGAINST ('$frase'))) uDR
  19.  
  20. GROUP BY uDR.webTitulo, uDR.weburl, uDR.webDescripcion, uDR.webkeywords
  21.  
  22. ORDER BY SPriority DESC
  23.  
  24.                       LIMIT $inicio, $TAMANO_PAGINA ");

¿Hay alguna forma para combinar ambos?, probé con el operador AND pero no funcionó, no me mostraba ningún registro.

Saludos!!

PD: Actualmente estoy utilizando full text, pero tenía ciertos inconvenientes, así que decidi combinarlo con BOOLEAN MODE y aplicar este algoritmo que intentaba recién.
__________________
Naica enciclopedia animal
  #8 (permalink)  
Antiguo 01/04/2013, 16:34
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 9 meses
Puntos: 181
Respuesta: Ordenar registros por distancia PHP y MySQL

Bueno, si nos vamos a lo estrictamente justo esto no seria php sino MySQL, yo lo habia pensando de otra forma.

No suelo usar mucho el union porque me lia mazo mogollón. Si mal no recuerdo la columna del resultado de los UNION se renombraba con el nombre de la primera union, por tanto yo intentaria hacer el order by con la columna de la primera tabla. (En tu caso particular uDR.webTitulo, podrias incluso colocarle un alias para que quedara unificado)

Por obvias razones no lo puedo probar aca pero creo que deberia funcionar. En eso de los UNION no soy muy habil (yo generalmente solo pego los resultados sin ordenarlos) asi que lo que te comento es mas que todo especulación.

Yo tambien lo ordenaria con los webDescripcion. Quizas por php lo veo "mas facil" pero la dinamica es la misma. El problema de hacerlo asi es que serian algunos pasos adicionales.

p.s. Si es el caso pide ayuda en el foro de MySQL porque creo que me defiendo con sql pero como en todo, existe gente con mas cancha que quizas te pueda ayudar mejor, igual no olvides colocar la solución. Me gusta full text pero no sobra probar métodos alternativos.
__________________
Blog de humor http://elcuasatar.net63.net/

Última edición por cuasatar; 01/04/2013 a las 16:43
  #9 (permalink)  
Antiguo 01/04/2013, 17:06
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: Ordenar registros por distancia PHP y MySQL

Muchas gracias por la ayuda!, ahora pregunto en el foro MySQL.
__________________
Naica enciclopedia animal
  #10 (permalink)  
Antiguo 01/04/2013, 17:15
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Ordenar registros por distancia PHP y MySQL

Cita:
Iniciado por Naica Ver Mensaje
Claro, les explico mejor:

Hagamos de cuenta que soy un usuario, y quiero buscar "Recetas de cocina", los resultados que deberian aparecerme son:

Recetas de cocina
2º Todo sobre recetas de cocina
3º Carnes, pescados, frutas y distintas recetas de cocina


Intento que aparezcan primero los resultados que contengan la palabra buscada más cerca del inicio del texto,
Cuando dices "deberían", es porque es un requisito que tienes, o porque crees que eso es lo que refleja un buen resultado?
Si es el segundo caso...creo que lo tendrías que volver a pensar.
Qué diferencia hay entre:
1º Recetas de cocina variadas, carnes, pescados y frutas.
y
2º Carnes, pescados, frutas y distintas recetas de cocina
?
A nivel de relevancia, son equivalentes.
Con el conjunto de ejemplos que has puesto, hay otro criterio para ordenar esas frases de esa forma: el primer ejemplo, con respecto a la cadena de búsqueda, la coincidencia es del 100%..o sea..la longitud de la cadena de búsqueda coincide con la longitud del caso 1.El conjunto de ejemplos que pones se puede ordenar comparando la longitud de la cadena de búsqueda con la longitud del posible match.Una definición más exacta sería la distancia en palabras, más que en caracteres, pero quizás complicaría el algoritmo.

Etiquetas: distancia, mysql, registro, registros
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 14:06.