2017-01-24 7 views
0

MySQLで2つの整数列がある範囲のすべての数値を取得しようとしています。ここで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を見ましたが、提供されたソリューションをどのように適用するのか分かりませんでした。

+1

"すべての行を選択して解析するのが遅くなる"と私の推測では間違っているとわかっています。 – Strawberry

+0

@Strawberry - PHPは問題ありませんでした。私が以下に概説した純粋なSQLメソッドは、より高速です。 – billynoah

答えて

0

this answerのコンセプトに適応した自分自身の問題を解決しました。

まず(これはあなたに1900を取得 - 私の目的のために適切である2099年)インデックスを持つ年の表を作成します。

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; 
:このような年CONCAT

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 
) 

次は、単に参加し、グループを

これは非常に高速です.137,000行を解析するのに77msです。これが誰かを助けることを望みます。

関連する問題