mysql Strings mit mehreren Zahlen und Trennzeichen sortieren

tutor0

Grünschnabel
Ich habe in einer mysql - Tabelle in einem String mehrere Zahlen gespeichert z.B.: 5a3a2.
Die Zahlen werden durch das 'a' getrennt.
Ich möchte nun die Strings 5a3a2; 10a0; 3a4 folgendermaßen sortieren:
3a4
5a3a2
10a0

Die Ausgabe von "SELECT * FROM `tabelle` ORDER BY BINARY zahlen" ergibt allerdings:
10a0
3a4
5a3a2

Ich würde mich freuen, wenn mir jemand eine Lösung für dieses Problem liefern könnte.
Mit freundlichen Grüßen
tutor0
 
Du könntest den String anhand der 'a' splitten und dann nach dem ersten Element, was aus dem Split kommt sortieren (ungtestet):

Code:
SELECT 
*,
SUBSTRING_INDEX( `zahlen` , 'a', 1) AS zahl_anfang
ORDER BY zahl_anfang ASC

Grüße

EDIT: Hier noch mal ein getesteter und tatsächlich funktionierender SQL:

Code:
SELECT * , CAST( SUBSTRING_INDEX( `zahlen` , 'a', 1 ) AS UNSIGNED ) AS zahl_anfang
FROM t
ORDER BY zahl_anfang ASC
 
Zuletzt bearbeitet:
Das Problem ist, das beliebig viele Zahlen in einem String sein können d.h. ich muss nicht nur nach dem ersten Element sortieren, sondern auch nach dem zweiten, dritten, ...

Meine eigentliche Idee war, dass mysql den String nach ascii-werten der einzelnen Buchstaben sortiert.
Da 'a' einen kleineren Wert (31) als die Zahlen (48-58) hat, habe ich es gewählt.
Nach dieser Verfahrensweise würden, 10a0 und 5a1 zu 5a1 und 10a0 sortiert werden.
Dies Funktioniert leider nicht mit ORDER BY BINARY.
Gibt es vielleicht einen Befehl der das oben Beschriebene ausführt.
 
Natürlich funktioniert es so nicht. Es würde folgender Vergleich herangezogen werden:

1 => 5
0 => a
a => 1
0 =>

Du hast dich darauf versteift, das 10 höher ist als 5, aber wenn du Binär vergleichst, wird Zeichen für Zeichen verglichen und nicht Nummern gruppiert und dann verglichen ;-)

Das sinnvollste wäre es, den String aufzudröseln und die verschiedenen Werte einzeln in die Datenbank zu schreiben.

Oder aber du löst das Problem in PHP - weswegen du vermutlich hier gepostet hast:

PHP:
<?php
function custom_sort($a, $b)
{
	foreach($a as $aa)
	{
		foreach($b as $bb)
		{
			if($aa < $bb)
				return -1;
			else if($bb < $aa)
				return 1;
		}
	}
	return 0;
}

function make_as(&$array)
{
	$array = implode('a', $array);
}

$values = array(
		'5a3a2','10a0', '3a4' 
);

$arrays = array();

foreach($values as $value)
{
	$arrays[] = explode('a', $value);
}

var_dump($arrays);

usort($arrays, 'custom_sort');

var_dump($arrays);

array_walk($arrays, 'make_as');

var_dump($arrays);

EDIT: Hab noch die make_as()-Funktion hinzugefügt, die wieder die a's einfügt ;-)

EDIT2: Hab noch mal ein bisschen damit rumgetestet, die custom_sort-Funktion hats irgendwie nicht so gebracht. Die hier ist viel besser:

PHP:
function custom_sort($a, $b)
{
	$num_elements = count($a);
	if(count($b) > $num_elements) $num_elements = count($b);
	for($i = 0; $i < $num_elements; $i++)
	{
		$aa = isset($a[$i]) ? (int)$a[$i] : 0;
		$bb = isset($b[$i]) ? (int)$b[$i] : 0;

		if($aa < $bb)
			return -1;
		else if($bb < $aa)
			return 1;
	}
	return 0;
}

Getestet hab ich diesmal mit diesen Werten:

PHP:
$values = array(
		'5a3a2','10a0', '3a4', '5a3a5', '10a7a0', '3'
);
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück