Seleccionar cercanos mediante MySQL

En algunos casos tenemos la necesidad de buscar registros cercanos a un cierto valor (numérico, logicamente). Una solución sencilla es obtener el valor absoluto de la resta entre el valor que buscamos y el valor del registro, ordenar por ese valor y limitar la búsqueda a n registros:

SELECT number, ABS( number - 2500 ) AS distance
FROM numbers
ORDER BY distance
LIMIT 6

El problema es que esta consulta es lenta, y en producción no nos podemos permitir consultas lentas, por lo que una opción mucho más eficiente es en vez de realizar esa consulta sobre todos los registros, realizarla sobre la unión de dos consultas: una de los n/2 registros con valor superior al que buscamos y otra con los n/2 registros con valor menor al que buscamos, y luego ordenando como la consulta anterior y cogiendo solo los elementos que nos interesan:

SELECT number, ABS( number - 2500 ) AS distance FROM (
(
SELECT number
FROM `numbers`
WHERE number >=2500
ORDER BY number
LIMIT 6
) UNION ALL (
SELECT number
FROM `numbers`
WHERE number <2500
ORDER BY number DESC
LIMIT 6
)
) AS n
ORDER BY distance
LIMIT 6

Selecting closest values in MySQL

Vía / dzone

Similar Posts