2016-06-06 13 views
0

Gibt es eine Möglichkeit, fortlaufende Nummer Untersequenzen in MYSQL zu verfolgen?Sequenzen in MYSQL

Ich mag die höchsten Dauerfolgen in der Folge von Zahlen zählen:

1,2,3,4,6,7 => 4 (1-4) 
1,2,3,4,5,6,8 => 6 (1-6) 
1,2,3,5 => 3 (1-3) 
1,2,3,5,6,7,8 => 4 (5-8) 
1,2,4,5,6,8,9 => 3 (4-6) 
+3

Bitte erläutern Sie Ihre Frage. Der Text macht keinen Sinn. –

+0

@GordonLinoff Arie hätte sein Problem genauer erklären können, aber es macht im Endeffekt Sinn. –

+0

@JeffPuckettII. . . Sie sind sinnvoll, wenn Sie die längste Sequenz betrachten (5, 6, 7, 8 und 4, 5, 6). –

Antwort

0

Nach Ihrer Frage soll dieser Code funktionieren:

function findHighestSeriesCount($seriesArray) 
{ 
    if (1 >= count($seriesArray)) 
    { 
     # catch the special case when array has only 0 or 1 element 
     return count($seriesArray); 
    } 
    $highestCount = -1; 
    $currentCount = 1; 
    $lastElement = $seriesArray [0]; 

    $getCorrectHighValue = function() use (&$highestCount, &$currentCount) 
    { 
     return $highestCount < $currentCount ? $currentCount : $highestCount; 
    }; 

    for ($arrayIndex = 1 ; $arrayIndex < count($seriesArray) ; $arrayIndex++) 
    { 
     if ($lastElement + 1 == $seriesArray [$arrayIndex]) 
     { 
      $currentCount++; 
     } 
     else 
     { 
      $highestCount = $getCorrectHighValue(); 
      $currentCount = 1; 
     } 
     $lastElement = $seriesArray [$arrayIndex]; 
    } 

    return $getCorrectHighValue(); 
} 

Testskript:

$seriesArray = [1,2,3,4,6,7]; 
echo sprintf("array=%s - highest count=%d<br>", implode(",", $seriesArray), 
    findHighestSeriesCount($seriesArray)); 

$seriesArray = [1,2,3,4,5,6,8]; 
echo sprintf("array=%s - highest count=%d<br>", implode(",", $seriesArray), 
    findHighestSeriesCount($seriesArray)); 

$seriesArray = [1,2,3,5]; 
echo sprintf("array=%s - highest count=%d<br>", implode(",", $seriesArray), 
    findHighestSeriesCount($seriesArray)); 

$seriesArray = [1,2,3,5,6,7,8]; 
echo sprintf("array=%s - highest count=%d<br>", implode(",", $seriesArray), 
    findHighestSeriesCount($seriesArray)); 

$seriesArray = [1,2,4,5,6,8,9]; 
echo sprintf("array=%s - highest count=%d<br>", implode(",", $seriesArray), 
    findHighestSeriesCount($seriesArray)); 

Ausgabe:

array=1,2,3,4,6,7 - highest count=4 
array=1,2,3,4,5,6,8 - highest count=6 
array=1,2,3,5 - highest count=3 
array=1,2,3,5,6,7,8 - highest count=4 
array=1,2,4,5,6,8,9 - highest count=3 
+0

Das funktioniert gut, aber ich möchte es in einer Abfrage tun, damit ich sie sortieren kann. – Arie

+0

@Arie Aha, weil Sie die Frage mit PHP markiert haben Ich dachte, dass Sie nach einem PHP-Code suchen. Könnten Sie meinen Code in eine gespeicherte Prozedur konvertieren? –

0

Angenommen, die Daten werden als Spalte gespeichert, können Sie den größten Wert erhalten, indem Sie die längste fortlaufende Sequenz finden. Die Idee ist einfach, eine andere Sequenz zu subtrahieren. . . wo die Werte konstant sind, weißt du, dass du eine Sequenz hast.

Der Rest ist nur Aggregation. Das sieht so aus:

select count(*) 
from (select t.*, (@rn := @rn + 1) as rn 
     from t cross join (select @rn := 0) params 
    ) t 
group by (col - rn) 
order by count(*) desc 
limit 1; 
+0

Ich versuche diese Abfrage zu verwenden, verstehe aber nicht, was mit allen gemeint ist. Ich habe eine Tabelle mit Menschen und Jahren und möchte die aufeinanderfolgenden Jahre zählen und sortieren – Arie

+0

Ich habe jetzt: 'SELECT *, COUNT (ID) FROM Ergebnis WHERE Pos = 1 GROUP BY Benutzer ORDER BY COUNT (ID) DESC' – Arie

+0

@Arie. . . Sie sollten eine andere Frage mit geeigneten Daten, gewünschten Ergebnissen und einer Beschreibung dessen, was Sie wirklich versuchen, stellen. –