2010-12-08 3 views
8

MySQL에서 정수 범위를 선택해야합니다. 이MySQL의 SELECT 범위를 선택하십시오. 예 : 1,2,3,4, ..., n;

SELECT RANGE(10,20) AS range;

반환

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

같은 뭔가?
아직 등록되지 않은 범위에서 임의의 전화 번호를 선택하고 싶습니다. 이것은 좋은 생각입니다. 쿼리와

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

+2

왜 SQL 쿼리를 사용하는 프로그램 내에서 실행하지 않습니까? –

+0

항상 하나의 전화 번호를 반환해야합니까, 아니면 한 번에 1000 개의 새 전화 번호를 선택할 수 있기를 원하십니까? 그리고 당신은 어딘가에 "이미 주어진"폰의 테이블을 가지고 있습니까? – thomaspaulb

답변

8

문제 : 당신은 WHERE 절에 range을 사용할 수 없습니다

  1. . 별명이며 WHERE 절이 수행 된 후에 만 ​​정의됩니다.
  2. 사용할 수 있더라도 <>을 사용하여 숫자와 숫자를 비교하는 것은 의미가 없습니다. 일반적으로 IN(...)을 사용할 수 있지만 특별한 경우에는 BETWEEN 100000 and 999999을 사용해야하고 RANGE 기능이 필요하지 않습니다.
  3. 하나의 숫자 만 원할 경우 제한은 1이어야하며 무작위가 아닙니다. 일반적으로 임의 항목을 선택하려면 ORDER BY RAND()을 사용하십시오.

이 쿼리를 사용해보십시오 : 당신이 당신의 테이블에없는 숫자를 찾으려면

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

을 사용 가능한 번호가 고갈에 근접하지 않습니다 (예를 들어 80 % 미만이 할당됩니다) 좋은 접근법은 난수를 생성하고 그렇지 않은 것을 찾을 때까지 할당되어 있는지 확인하는 것입니다.

순수 MySQL 솔루션이있을 수 있지만 일부 비틀린 결합, 임의 및 모듈러스가 필요하다고 생각합니다.

+0

해당 쿼리가 기존 전화 번호를 반환하지 않습니까? 그는 테이블에 존재하지 않는 범위의 무작위 값, 즉'SELECT number FROM RANGE (100000,999999)가 존재하지 않는 곳에서 (SELECT phoneNum FROM phone WHERE phoneNum = number) ORDER BY RAND() LIMIT 1' -'RANGE'가 즉석에서 숫자 표를 생성 한 경우 – Rup

+0

@Rup 이제 당신이 말 했으니 이해가됩니다. 나는 지금까지 요구 사항을 이해하지 못했습니다. –

+0

@Rup 난 그 종류의 테이블을 즉시 생성하는 것이 매우 효율적이라고 생각하지 않습니다. –

0

는 대안 : 모든

먼저 1 MAX_NUM 모든 숫자를 가지고 단지 숫자 테이블을 만들 수 있습니다. 당신은 또한 한계 값을 변경하여 상대적으로 빠른 여러 수를 얻을 수 있습니다

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 

이 방법 :

그런 다음이 쿼리를 사용합니다.