有一种方法可以在单个查询中获取一系列值,但它有点慢。它可以通过使用缓存表来加速。
假设您想要一个包含所有 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(*) 将需要很长时间,如果您在 MAX-MIN 大于 100k 时错误地添加 ORDER BY,则将再次需要几秒钟来计算...