1

次のテーブルがあるとしますvalues

date       | value
2012-01-01 |    8
2012-01-02 |    3
2012-01-03 |   17
2012-01-09 |  100
2012-01-12 |    2

ここで、2012-01-02 から 2012-01-12 までのすべての日付を選択し、存在する場合はそれらの値を表示するとします。適切な日付範囲のテーブルを単純にクエリすると、明らかな理由から、値を持たない日付は表示されなくなります。これらの日付をクエリに入力する方法はありますか?

明白な解決策は、発生するdates可能性のあるすべての日付のリストを格納するだけのテーブルを作成し、テーブルから選択してそれにdates参加valuesすることですが、作成に依存しないソリューションが必要です可能であれば、単一列のテーブル。

注:このトピックに関するSOに関する既存の 質問がありますが、それらはすべて 2010 年のものであり (少なくとも検索時に見つけたものはそうでした)、MySQL の機能はその間に成長しました。現在、動的な解決策があるかもしれません。そうではなく、表がまだ最善の解決策である場合、この質問は重複としてクローズする必要があります。dates

4

1 に答える 1

0

他の人からの回答がないことは、現時点では、それらの日付を保持するテーブルがないと、MySQL で日付の範囲をトラバースできないことを示唆しています。ただし、欠落している日付を後から埋めるために使用しているコードを PHP でいくつか書きました。

function formatResults($inbound, $from, $to) {
    $results = array();
    $count = 0;

    // In order not to lose any results, we have to change how the results are referenced
    $indexes = array();
    $stats = array();
    foreach ($inbound as $stat) {
        // ['listindex'] is the date, renamed in the query
        $stats[$stat['listindex']] = $stat;
    }

    // In a function in case you want to pop it out
    function dateArray($from, $to) {
        $begin = new DateTime($from);
        $end = new DateTime($to);
        $interval = DateInterval::createFromDateString('1 day');
        $days = new DatePeriod($begin, $interval, $end);
        $baseArray = array();
        foreach ($days as $day) {
            $dateKey = $day->format("Y-m-d");
            $baseArray[] = $dateKey;
        }
        $baseArray[] = $to;
        return $baseArray;
    }
    $indexes = dateArray($from, $to);

    // Now all the rows we need to return are uniquely identified in $indexes
    // So we traverse $indexes to create our results array, rather than relying on $inbound
    foreach($indexes as $index) if ($index != '') {
        $data = array();
        // Make sure we do not run into any 'missing index' problems
        if (!isset($stats[$index]))
            $stats[$index] = array(
                'listindex' => $index,
                // ... populate full list of empty fields
            );
        foreach ($stats[$index] as $key => $value) {
            $data[] = $value;
        }
        $results[$count] = $data;
        $count++;
    }
    return $results;
}
于 2013-04-05T12:58:27.137 に答える