Есть способ получить диапазон значений в одном запросе, но он немного медленный. Его можно ускорить, используя кеш-таблицы.
Предположим, вы хотите выбрать с диапазоном всех значений BOOLEAN:
SELECT 0 as b UNION SELECT 1 as b;
мы можем сделать вид
CREATE VIEW ViewBoolean AS SELECT 0 as b UNION SELECT 1 as b;
тогда вы можете сделать байт по
CREATE VIEW ViewByteValues AS
SELECT b0.b + b1.b*2 + b2.b*4 + b3.b*8 + b4.b*16 + b5.b*32 + b6.b*64 + b7.b*128 as v FROM
ViewBoolean b0,ViewBoolean b1,ViewBoolean b2,ViewBoolean b3,ViewBoolean b4,ViewBoolean b5,ViewBoolean b6,ViewBoolean b7;
тогда вы можете сделать
CREATE VIEW ViewInt16 AS
SELECT b0.v + b1.v*256 as v FROM
ViewByteValues b0,ViewByteValues b1;
тогда вы можете сделать
SELECT v+MIN as x FROM ViewInt16 WHERE v<MAX-MIN;
Чтобы ускорить это, я пропустил автоматический расчет значений байтов и сделал себе
CREATE VIEW ViewByteValues AS
SELECT 0 as v UNION SELECT 1 as v UNION SELECT ...
...
...254 as v UNION SELECT 255 as v;
Если вам нужен диапазон дат, которые вы можете сделать.
SELECT DATE_ADD('start_date',v) as day FROM ViewInt16 WHERE v<NumDays;
или
SELECT DATE_ADD('start_date',v) as day FROM ViewInt16 WHERE day<'end_date';
Вы можете ускорить это с помощью немного более быстрой функции MAKEDATE
SELECT MAKEDATE(start_year,1+v) as day FRON ViewInt16 WHERE day>'start_date' AND day<'end_date';
Обратите внимание, что эти трюки ОЧЕНЬ МЕДЛЕННЫЕ и позволяют создавать только КОНЕЧНЫЕ последовательности в заранее определенной области (например, int16 = 0 ... 65536)
Я уверен, что вы можете немного изменить запросы, чтобы ускорить процесс, указав MySQL, где прекратить вычислять;) (используя предложения ON вместо предложений WHERE и тому подобное)
Например:
SELECT MIN + (b0.v + b1.v*256 + b2.v*65536 + b3.v*16777216) FROM
ViewByteValues b0,
ViewByteValues b1,
ViewByteValues b2,
ViewByteValues b3
WHERE (b0.v + b1.v*256 + b2.v*65536 + b3.v*16777216) < MAX-MIN;
будет поддерживать ваш SQL-сервер на несколько часов
Однако
SELECT MIN + (b0.v + b1.v*256 + b2.v*65536 + b3.v*16777216) FROM
ViewByteValues b0
INNER JOIN ViewByteValues b1 ON (b1.v*256<(MAX-MIN))
INNER JOIN ViewByteValues b2 ON (b2.v*65536<(MAX-MIN))
INNER JOIN ViewByteValues b3 ON (b3.v*16777216<(MAX-MIN)
WHERE (b0.v + b1.v*256 + b2.v*65536 + b3.v*16777216) < (MAX-MIN);
будет работать достаточно быстро - даже если MAX-MIN огромен, если вы ограничите результат с помощью LIMIT 1,30 или чего-то еще. COUNT (*), однако, займет много времени, и если вы допустите ошибку, добавив ORDER BY, когда MAX-MIN больше, чем, скажем, 100k, для расчета снова потребуется несколько секунд ...