0

重複の可能性:
一連の日付の生成

特定の範囲で一連の数値を生成するためのmysqlでの最良の方法は何ですか?

私が念頭に置いているアプリケーションは、レポートするデータがあるかどうかに関係なく、すべての数値に対して行を返すレポート クエリを作成することです。最も単純な形式の例は次のとおりです。

SELECT numbers.num, COUNT(answers.id)
FROM <series of numbers between X and Y> numbers
     LEFT JOIN answers ON answers.selection_number = numbers.num
GROUP BY 1

たくさんの数字でテーブルを作成しようとしましたが、それは不十分な回避策のようです。

4

2 に答える 2

2

まず、0 から 9 までの数字ごとに 1 つのレコードを含む ints というテーブルを作成します。

CREATE TABLE ints ( i tinyint );

次に、そのテーブルにデータを入力します。

INSERT INTO ints VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

これで、次のようなクエリを使用して一連の数値を生成できます。

SELECT generator.num, COUNT(answers.id)
FROM (
    SELECT a.i*10 + b.i AS num
    FROM ints a, ints b
    ORDER BY 1
) generator
LEFT JOIN answers ON answers.selection_number = generator.num
WHERE generator.num BETWEEN 18 AND 43

生成された数値に別の桁の値を追加するには、ints テーブルの結合をさらに追加し、それに応じて計算を調整します。以下は、3 桁の数字を生成します。

SELECT generator.num, COUNT(answers.id)
FROM (
    SELECT a.i*100 + b.i*10 + c.i AS num
    FROM ints a, ints b, ints c
    ORDER BY 1
) generator
LEFT JOIN answers ON answers.selection_number = generator.num
WHERE generator.num BETWEEN 328 AND 643
于 2012-12-31T21:06:33.093 に答える
0

groupby1の代わりにgroupbynumbers.numで試すことができます

SELECT numbers.num, COUNT(answers.id)
FROM numbers
     LEFT JOIN answers ON answers.selection_number = numbers.num
WHERE numbers.num between X and Y
GROUP BY numbers.num
于 2012-12-31T20:51:50.603 に答える