Mit Versionen gefülltest Array sortieren

Dann hast du irgendwo einen Schreibfehler drin. Die SQL-Anweisung von DeeJTwoK läuft bei mir bestens und ich habe es wie gesagt bei mir vorher auch schon so gemacht.
 
Ich bekomme keinen Fehler.
Ich führe das Query a) c&p von hier ausm Forum direkt auf mysql ebene aus
b) lasse ich die $abfrage per echo ausgeben bevor sie mit mysql_query ausgeführt wird und kopiere sie von dort mit unterschiedlichsten beispielen
c) direkt auf der Seite aus

Aber naja... :D Ich habe inzwischen ne ganze Menge geändert und sortiere mit array_multisort().
Aktuell ist das Skript so:
PHP:
	$v1 = isset($_POST['v1']) ? $_POST['v1'] : "";
	$v2 = isset($_POST['v2']) ? $_POST['v2'] : "";
	$v1exp = explode(".", $v1);
	$v2exp = explode(".", $v2);
	if($v1exp[3] > $v2exp[3]) {
		$v1 = implode(".", $v2exp);
		$v2 = implode(".", $v1exp);
		$a = $v2exp[3];
		$v2exp[3] = $v1exp[3];
		$v1exp[3] = $a;
	}
	$base = $v1exp[0].".".$v1exp[1].".".$v1exp[2];

	/* Releases[] mit ID und Version aller relevanten Releases befüllen */
	$abf="SELECT ID, version FROM releases WHERE version LIKE \"".$base.".%\" AND SUBSTRING_INDEX(version, \".\", -1) BETWEEN ". $v1exp[3] ." AND ". $v2exp[3] ." ORDER BY SUBSTRING_INDEX(version, \".\", -1)";
	$qry = mysql_query($abf) or die(mysql_errno().": ".mysql_error());
	while($row = mysql_fetch_assoc($qry)) {
		$rel = preg_replace("/\.([0-9]{1})$/", '.0$1', $row['version']);
		$releases[] = array("version" => "$rel", "ID" => (int)$row['ID']);
	}
	array_multisort($releases);

	foreach($releases as $index => $rel) {
		$releases[$index]['version'] = preg_replace("/\.([0]([0-9]{1}))$/", '.$2', $rel['version']);
	}
	
	foreach($releases as $index => $rel) {
		$qry = mysql_query("SELECT `dateiversionID` AS dvID FROM `releasedateien` WHERE `releaseID` = " . $rel['ID'] . " ORDER BY dvID") or die(mysql_errno().": ".mysql_error());
		while($row = mysql_fetch_assoc($qry)) {
			$releases[$index]['dateien'][] = $row['dvID'];
		}
	}
	print_r(compareReleases($releases));
Letztlich sollen wie gesagt die Unterschiede der einzelnen Releases angezeigt werden. Ich erarbeite jetzt compareReleases(), welches nur die Unterschiede von dvID anzeigen soll ...array_diff().
Man man man.. das gesamte Versionsmanagement ist ja soweit nicht soooo Bombe, aber über mehrere Releases den Changelog ausgeben... ay caramba!
 
Nur für den Fall das es jemand interessiert wie es geht, hänge ich hier mal eine Datei dran.

Zum Testen einfach die Zugangsdaten zur Datenbank anpassen und fertig.
 

Anhänge

Also mir sieht es eher danach aus als würde er falsch sortieren.

Der Code ist definitiv der gleiche. A) siehe deine Datei B) siehe mein geposteter Quellcode
Leider sortiert er bei mir falsch :(
Und um wirklich ganz sicher zu gehen habe ich gerade deine SQL Abfrage aus der release.php unter meine abfrage kopiert:
http://myscorpion.de/sql__.PNG
 
djscorpion,
füg mal bitte in deinem Quellcode aus dem Screenshot vor der Zeile "$qry = "... das ein:
PHP:
echo "<pre>".$abf."</pre>";
und gib uns den output

Führ dann mal bitte diesen Output direkt in phpMyAdmin aus und mach nen Screenshot vom Ergebnis.
 
Pre-Output:
Code:
SELECT ID, version FROM releases WHERE version LIKE '4.12.1%' AND SUBSTRING_INDEX(version, ".", -1) BETWEEN 4 AND 13 ORDER BY SUBSTRING_INDEX(version, ".", -1)
HAb leider kein phpMyAdmin und hoffe MySQL Workbench tuts auch ;-) (siehe Anhang)

Außerdem gibts direkt nochmal eine Quellcode-Kopie von $abf
PHP:
$abf = 'SELECT ID, version FROM releases WHERE version LIKE \'' . $base .'%\' AND SUBSTRING_INDEX(version, ".", -1) BETWEEN ' . $v1exp[3] . ' AND ' .   $v2exp[3] .' ORDER BY SUBSTRING_INDEX(version, ".", -1)';
 

Anhänge

  • output.PNG
    output.PNG
    32,3 KB · Aufrufe: 5
Ändere mal die ORBER BY Anweisung so ab:

SQL:
ORDER BY CONVERT(SUBSTRING_INDEX(version, ".", -1), SIGNED)
 
Ah OK, das sieht doch schon nicht soo schlecht aus.

Die Datenbank sortiert nur leider auf Stringbasis, also kommt der String "12" vor dem String "4".
Du könntest also die Zahlen auf eine feste Länge (nämlich 2) mit führenden Nullen aufüllen, dann kommt "04" nämlich vor "12":
SQL:
SELECT ID, version FROM releases WHERE version LIKE '4.12.1%' AND SUBSTRING_INDEX(version, ".", -1) BETWEEN 4 AND 13 ORDER BY LPAD(SUBSTRING_INDEX(version, ".", -1), 2, '0')
Oder was vielleicht auch funktioniert, ist dass du den String erst in eine Zahl umwandelst, denn Zahl 4 kommt vor Zahl 12:
SQL:
SELECT ID, version FROM releases WHERE version LIKE '4.12.1%' AND SUBSTRING_INDEX(version, ".", -1) BETWEEN 4 AND 13 ORDER BY CONVERT(SUBSTRING_INDEX(version, ".", -1), SIGNED)
Dann sollte die Sortierung richtig sein.

Außerdem würde ich den letzen Punkt beim LIKE noch dabei lassen, damit du nicht Version 4.12.10.x ausliest sondern wirklich nur 4.12.1.x:
SQL:
LIKE '4.12.1.%'

/edit: Da war ich wohl zu langsam :D
 
Ok Cool Guys!
Das mit dem Convert hat geklappt. Verstehe allerdings trotzdem nicht wieso ihr dachtet ich hätte etwas falsch...
Bei euch wurde das ganze also richtig sortiert? (ohne das convert)

Und das mit dem . hatte ich entfernt nachdem in der release.php von tombe keiner vorhanden war. Aber die Logik siegt ;-)

Vielen Dank nochmal für die Hilfe! Die restliche Arbeit mache ich dann (erstmal) selbst ;-)
 
Zurück