2010-12-08 23 views
8

Necesito seleccionar el rango del número entero en MySQL. Algo como estoSELECCIONE el rango de enteros en MySQL. P.ej. 1,2,3,4, ..., n;

SELECT RANGE(10,20) AS range;

vuelve

10, 11, 12, 13, 14, ..., 20

¿Por qué?
Me gustaría seleccionar un número de teléfono aleatorio del rango que aún no está registrado. Esta es idea

SELECT RANGE(100000,999999) AS range FROM phone WHERE phoneNum <> range LIMIT FLOOR(100000 + RAND()*(899999);

+2

¿Por qué no hacerlo dentro del programa que está haciendo uso de las consultas SQL? –

+0

¿Necesita siempre devolver un número de teléfono o desea poder seleccionar 1000 nuevos números de teléfono a la vez? ¿Y en alguna parte tienes una tabla de números de teléfono "ya entregados"? – thomaspaulb

Respuesta

8

Problemas con su consulta:

  1. No se puede utilizar range en la cláusula WHERE. Es un alias y solo se definirá después de que se realice la cláusula WHERE.
  2. Incluso si pudiera usarlo, no tiene sentido comparar un número con un conjunto de números usando <>. En general, puede usar IN(...), pero en su caso particular debe usar BETWEEN 100000 and 999999 y evitar la necesidad de una función RANGE.
  3. Si solo quiere un número, entonces el límite debe ser 1, no algo aleatorio. Por lo general, para seleccionar elementos aleatorios, usa ORDER BY RAND().

Trate de usar esta consulta:

SELECT phoneNum, 100000 as rangeStart, 999999 AS rangeEnd 
FROM phone 
WHERE phoneNum NOT BETWEEN 100000 AND 999999 
ORDER BY RAND() 
LIMIT 1 

Si desea encontrar un número no en su mesa y los números disponibles no están cerca de agotamiento (por ejemplo menos del 80% son asignados) un buen enfoque sería generar números aleatorios y verificar si están asignados hasta que encuentre uno que no lo sea.

Puede existir una solución pura de MySQL, pero creo que necesita algunas uniones retorcidas, aleatorio y módulo.

+0

¿No devolverá esa consulta un número de teléfono existente? Quiere devolver un valor aleatorio en el rango que no existe en la tabla, es decir, 'SELECCIONAR número FROM RANGE (100000,999999) WHERE NOT EXISTS (SELECCIONAR phoneNum FROM phone WHERE phoneNum = number) ORDER BY RAND() LIMIT 1 ' - si 'RANGE' generó una tabla de números sobre la marcha – Rup

+0

@Rup Ahora que lo dices, tiene sentido. No entendí el requisito hasta ahora. –

+0

@Rup No creo que sea muy eficiente generar ese tipo de tablas sobre la marcha. –

0

Una alternativa:

En primer lugar crear una tabla con sólo números que tiene todos los números del 1 al MAX_NUM.

A continuación, utilice esta consulta:

SELECT n.id as newNumber 
FROM numbers AS n 
LEFT JOIN phone AS p 
    ON p.phoneNum = n.id 
WHERE 
    p.phoneNum IS NULL AND 
    n.id BETWEEN lowerLimit AND upperLIMIT  
ORDER BY RAND() 
LIMIT 1 

De esta manera también se puede obtener un número múltiple relativamente rápido cambiando el valor límite.

Cuestiones relacionadas