2017-08-28 3 views
0

Ich habe eine Tabelle mit einer Datumsspalte und einer Preisspalte. Die Datumsspalte enthält eine Zeile für jeden Tag des Jahres.mysql erste und letzte Datum in Datum Spalte mit gleichem Wert in anderen Spalte

Die Tabelle ist wie folgt:

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 

ich das erste Datum und letztes Datum in einem Zeitbereich erhalten mag, die gleichen Preis.

So das Ergebnis sollte oben sein:

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

Irgendwelche Ideen?

+0

Dies ist eine schwierige Frage, weil Sie ein neues Paar Tage, das nächste Mal der Preis wieder auf 158 wollen; Im OP gibt es also drei Ergebnisse, obwohl es nur 2 Preise gibt. Was denkst du über das Parsen der Ergebnisse in PHP? – BeetleJuice

+0

Eigentlich habe ich viel mehr mit gleichem Preis, auch mit verschiedenen Jahren. Es ist nur für den Ausdruck der Preise für die verschiedenen Zeiträume, kann im selben Jahr wiederholt werden und darf nicht. – Helenp

Antwort

1

sehen, ob dies für Sie arbeitet. Es basiert auf einer anderen Antwort, die ich hier gegeben habe. Sie durchlaufen die Tage und sammeln jeden Tag, der den gleichen Preis wie zuvor in einem Array hat. Jedes Mal, wenn die Schleife eine Preisänderung feststellt, wird ein neues Array erstellt und so weiter.

<?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

Das sieht fantastisch aus, genau was ich will. Eine Million Dank – Helenp

+0

Ich bin froh, dass ich helfen konnte. – ishegg

+0

Entschuldigung ... Wie im Beispiel nehme ich an, dass ich die PDO Abfrage als ein Array ausgeben muss, das wie in Ihrem Beispiel ist. Wenn ich meine Abfrage hinzufüge, funktioniert es nicht, also nehme an, dass ich die Abfrage nicht korrekt als Array ausgäbe – Helenp

0

Wenn Sie das Datum Spalte Dte und Menge Spalte ist amt dann Ihre Abfrage sein sollte wie folgt

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

Danke, aber das gruppiert alle mit gleichem Preis zusammen ... Ich will nur die Tage hintereinander haben. In meinem Beispiel oben 1-4 September und 20-21 Okt hat den gleichen Preis, aber ich möchte Oktober getrennt von September als nicht aufeinander folgenden Tagen ... – Helenp

Verwandte Themen