2017-08-28 7 views
0

私は、日付列と価格列を持つ表を持っています。 日付の列には、その年の各日の行があります。mysqlは、他の列の等しい値を持つ日付列の最初と最後の日付を取得します。

の表は、このようなものです:

2017-09-01 158.00 
2017-09-02 158.00 
2017-09-03 158.00 
2017-09-04 158.00 
etc. 
2017-09-10 175.00 
2017-09-11 175.00 
etc. 
2017-10-20 158.00 
2017-10-21 158.00 

私は同じ価格を持っている時間範囲内の最初の日と最後の日付を取得したいです。

だから、上記の結果が次のようになります。

2017-09-01 -- 2017-09-04 158 euro. 
    2017-09-10 -- 2017-09-11 175 euro. 
    2017-10-20 -- 2017-10-21 158 euro. 

任意のアイデア?

+0

あなたが日付の新しいペアに価格は158に戻り、次の時間が欲しいので、これは厳しいものです。したがってOPには2つの価格しかないのに3つの結果があります。 PHPで結果を解析するとどう思いますか? – BeetleJuice

+0

実際に私は別の年であっても、同じ価格ではるかに多くを持っています。 異なる期間の価格を印刷するためだけに、同じ年に繰り返されるかもしれないし、そうでないかもしれません。 – Helenp

答えて

1

のようにする必要がある場合、これはあなたのために働くかどうかを確認してください。私がここに与えた別の答えに基づいています。日中をループして、以前と同じ価格の毎日を配列に蓄積します。ループが価格の変化を検出するたびに、新しい配列が作成されます。

<?php 
$values[] = ["2017-09-01", "158.00"]; 
$values[] = ["2017-09-02", "158.00"]; 
$values[] = ["2017-09-03", "158.00"]; 
$values[] = ["2017-09-04", "158.00"]; 
$values[] = ["2017-09-10", "175.00"]; 
$values[] = ["2017-09-11", "175.00"]; 
$values[] = ["2017-10-20", "158.00"]; 
$values[] = ["2017-10-21", "158.00"]; 
$values[] = ["2017-10-22", "159.00"]; 
$values[] = ["2017-10-23", "152.00"]; 
$values[] = ["2017-10-24", "152.00"]; 
$ult = null; 
$currentRange = []; 
$ranges = []; 
foreach ($values as $fecha) { 
    $day = $fecha[0]; 
    $price = $fecha[1]; 
    if ($ult === null) { 
     $currentRange = [ 
      "price" => $price, 
      "days" => [$day] 
     ]; 
    } 
    else { 
     if ($price === $ult) { 
      $currentRange["days"][] = $day; 
     } 
     else { 
      $ranges[] = $currentRange; 
      $currentRange = [ 
       "price" => $price, 
       "days" => [$day] 
      ]; 
     } 
    } 
    $ult = $price; 
} 
$ranges[] = $currentRange; 
$rangesString = []; 
foreach ($ranges as $range) { 
    $str = $range["days"][0]; 
    if (count($range["days"]) > 1) { 
     $str .= " - ".$range["days"][count($range["days"]) - 1]; 
    } 
    $str .= ": ".$range["price"]; 
    $rangesString[] = $str; 
} 
echo (implode("<br>", $rangesString)); 

/* results: 
2017-09-01 - 2017-09-04: 158.00 
2017-09-10 - 2017-09-11: 175.00 
2017-10-20 - 2017-10-21: 158.00 
2017-10-22: 159.00 
2017-10-23 - 2017-10-24: 152.00 
*/ 

Demo

+0

それは私が欲しいものです。おかげで百万円 – Helenp

+0

私は助けることができてうれしい。 – ishegg

+0

申し訳ありません。例のように、あなたの例と同じ配列としてPDOクエリを出力する必要があると思います。クエリを追加するとうまくいかないので、クエリを配列として正しく出力していないとします。 – Helenp

0

あなたの日付列は、DTEで、金額欄がAMTである、あなたのクエリは、この

SELECT MIN(Dte), MAX(Dte), CONCAT(amt,' euro') FROM test 
GROUP BY amt 
+0

おかげさまで、グループはすべて同じ価格でグループ化されています...私は、連続する日だけが必要です。私の例では、上記の例では10〜20セプタムが同じ価格ですが、私は10月が9月とは別に連続した日ではありません。 – Helenp

関連する問題