tabla - cómo hacer una búsqueda por fechas con un formulario en php
Cómo hacerlo: clasificación de resultados de búsqueda (4)
Si está utilizando el patrón UNION ALL, también puede incluir las siguientes partes en su consulta:
SELECT COUNT(*) AS C
...
GROUP BY ID
ORDER BY c DESC
Si bien este es un ejemplo realmente trivial, sí te da la frecuencia de las coincidencias para cada resultado y para empezar podría ser un pseudo rango.
Tengo un problema de desarrollo de aplicaciones web para el que he desarrollado una solución, pero estoy tratando de encontrar otras ideas que puedan solucionar algunos problemas de rendimiento que estoy viendo.
planteamiento del problema:
- un usuario ingresa varias palabras clave / tokens
- la aplicación busca coincidencias con los tokens
- necesita un resultado para cada token
- es decir, si una entrada tiene 3 fichas, necesito la identificación de entrada 3 veces
- clasificar los resultados
- asignar X puntos para token match
- ordenar los identificadores de entrada basados en puntos
- si los valores de los puntos son los mismos, use la fecha para ordenar los resultados
Lo que quiero poder hacer, pero no me he dado cuenta, es enviar 1 consulta que devuelve algo similar a los resultados de un in (), pero devuelve un ID de entrada duplicado para cada token coincidencias para cada identificación de entrada marcada.
¿Hay una manera mejor de hacer esto que lo que estoy haciendo, de usar múltiples consultas individuales que ejecutan una consulta por token? Si es así, ¿cuál es la forma más fácil de implementarlos?
editar
Ya he tokenizado las entradas, así que, por ejemplo, "ver punto marcado" tiene una identificación de entrada de 1, y tres tokens, ''ver'', ''detectar'', ''ejecutar'', y esos están en una tabla de token separada, con identificadores de entrada relevantes para ellos, por lo que la tabla podría verse así:
''see'', 1
''spot'', 1
''run'', 1
''run'', 2
''spot'', 3
Probablemente obtendrá un rendimiento mucho mejor si utilizó una estructura de datos diseñada para tareas de búsqueda en lugar de una base de datos. Por ejemplo, puede tratar de construir un índice invertido . Sin embargo, en lugar de escribirte tú mismo, también deberías buscar algo como Lucene, que hace la mayor parte del trabajo por ti.
Sé que esto no es estrictamente una respuesta a la pregunta que está haciendo, pero si su tabla es de miles en lugar de millones de filas , entonces una solución FULLTEXT podría ser la mejor manera de hacerlo aquí.
En MySQL, cuando utiliza MATCH en su columna indexada, cada palabra clave que suministre recibirá un puntaje de relevancia (calculado aproximadamente por la cantidad de veces que se mencionó cada palabra clave) que será más preciso que su método y ciertamente más eficiente para múltiples palabras clave.
Vea aquí: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
podrías lograr esto en una consulta usando ''UNION ALL'' en MySQL.
Simplemente recorra los tokens en PHP creando un UNION ALL para cada token:
por ejemplo, si los tokens son ''x'', ''y'' y ''z'' su consulta puede parecerse a esto
SELECT * FROM `entries`
WHERE token like "%x%" union all
SELECT * FROM `entries`
WHERE token like "%y%" union all
SELECT * FROM `entries`
WHERE token like "%z%" ORDER BY score ect...
La cláusula de orden debe operar en todo el conjunto de resultados como uno, que es lo que necesita.
En términos de rendimiento, no será tan rápido (supongo), sin embargo, con las bases de datos, la sobrecarga principal en términos de velocidad suele enviar la consulta al motor de la base de datos desde PHP y recibir los resultados. Con esta técnica, esto solo ocurre una vez en lugar de una vez por token, por lo que el rendimiento aumentará, simplemente no sé si será suficiente.