我试图在MySQL中有两个整数列的范围内获取所有数字。
以下是结构示例:
+----+-------+------+
| id | a | b |
+----+-------+------+
| 1 | 1971 | 1975 |
| 2 | 1975 | 1975 |
| 3 | 1980 | 1982 |
+----+-------+------+
我喜欢的是这样的:
SELECT id, RANGE(a,b) as range FROM table;
输出应该是这样的:
+----+--------------------------+
| id | range |
+----+--------------------------+
| 1 | 1971 1972 1973 1974 1975 |
| 2 | 1975 |
| 3 | 1980 1981 1982 |
+----+--------------------------+
此外,该功能需要具有合理的性能,因为表中有超过100,000行。我最初在PHP中做了一些事情,但事实证明,选择和解析每一行都太慢了。我还没有尝试过任何事情,因为我完全不知道如何在SQL中做一些事情。
另外,我确实看过this question,但这是一个不同的案例,我无法弄清楚如何应用所提供的解决方案。
答案 0 :(得分:0)
解决了我在this answer中调整概念的问题。
首先创建一个带有索引的年份表(这样可以得到1900 - 2099,这对我来说是足够的):
CREATE TEMPORARY TABLE years (
years INT(11) NOT NULL,
PRIMARY KEY (years)
) AS
(
SELECT
(1900 + HUNDREDS.val + TENS.val + ONES.val) AS `years`
FROM
( SELECT 0 val UNION ALL SELECT 1 val UNION ALL SELECT 2 val UNION ALL SELECT 3 val UNION ALL SELECT 4 val UNION ALL SELECT 5 val UNION ALL SELECT 6 val UNION ALL SELECT 7 val UNION ALL SELECT 8 val UNION ALL SELECT 9 val ) ONES
CROSS JOIN
( SELECT 0 val UNION ALL SELECT 10 val UNION ALL SELECT 20 val UNION ALL SELECT 30 val UNION ALL SELECT 40 val UNION ALL SELECT 50 val UNION ALL SELECT 60 val UNION ALL SELECT 70 val UNION ALL SELECT 80 val UNION ALL SELECT 90 val ) TENS
CROSS JOIN
( SELECT 0 val UNION ALL SELECT 100 val ) HUNDREDS
)
接下来,简单地加入和分组concat这样的岁月:
SELECT id, GROUP_CONCAT(y.years SEPARATOR ' ') as `range`
FROM table t
LEFT JOIN years y ON (y.years >= t.a AND y.years <= t.b)
GROUP BY t.id;
这非常快 - 解析130,000行的时间为77毫秒。希望这有助于某人。