I need开发者_运维技巧 to select range of integer in MySQL. Something like this
SELECT RANGE(10,20) AS range;
returns
10, 11, 12, 13, 14, ..., 20
Why?
I would like to select random phone number from range which is not yet registered. This is idea.SELECT RANGE(100000,999999) AS range FROM phone WHERE phoneNum <> range LIMIT FLOOR(100000 + RAND()*(899999);
Problems with your query:
- You can't use
range
in the WHERE clause. It is an alias and will only be defined after the WHERE clause is performed. - Even if you could use it, it makes no sense to compare a number with a set of numbers using
<>
. In general you could useIN(...)
, but in you particular case you should useBETWEEN 100000 and 999999
and avoid the need for aRANGE
function. - If you only want one number then the limit should be 1, not something random. Usually to select random items you use
ORDER BY RAND()
.
Try using this query:
SELECT phoneNum, 100000 as rangeStart, 999999 AS rangeEnd
FROM phone
WHERE phoneNum NOT BETWEEN 100000 AND 999999
ORDER BY RAND()
LIMIT 1
If you want to find a number not in your table and the available numbers are not close to depletion (say less than 80% are assigned) a good approach would be to generate random numbers and check if they are assigned until you find one that isn't.
A pure MySQL solution may exists but I think it needs some twisted joins, random and modulus.
An alternative:
First of all create a table with just numbers that has all the numbers from 1 to MAX_NUM.
Then use this query:
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
This way you can also get multiple number relatively fast by changing the limit value.
Currently the MariaDB SEQUENCE engine can do this for you:
SELECT `seq` FROM `seq_1234_to_5678`;
精彩评论