• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] MySQL: exotische Sortierung

panamajo

Guru
Folgendes Problem:
In einer DB stehen verschiedene Artikel mit einem Feld Sprache (in ISO639, also 'de', 'en', 'fr', 'nl', ...) und einer Sachnummer (z.B. 11020383).

Bisher sortiere ich so: "ORDER BY sprachen.id ASC, sachnr ASC"

Jetzt ist aber eine Sortierung abhängig von der gewählten Sprache nötig, z.B. für Englisch:
en, de, (Rest)

für Deutsch:
de, en, (Rest)

Wie ich das SQL Ergebnis mit Hilfe von PHP entsprechend umsortieren kann ist klar, aber gibt es vielleicht eine SQL Lösung mit MySQL 4.1.13 Bordmitteln, bei der ich der Query eine deratrige Sortierung erzwingen kann?
 

ninguno

Member
in mysql 5 ginge es, z.b für deutsch:
Code:
select *
	  from artikel
	  order by case sprachen.id when 'de' then 1 when 'en' then 2 else sprachen.id end, sachnr;
ob das auch in mysql 4 funktioniert weiss ich nicht
 
OP
panamajo

panamajo

Guru
Super!
Mit ein wenig type-juggling gehts auch mit MySQL 3.23.*:
Code:
		// language dependent special sort order
		switch(strtolower($this->fields['Sprache'])) {
		case 'en':
			$sort0 = 'en';
			$sort1 = 'de';
			$sortfallback = 'nameEn';
			break;
		case 'de':
		default:
			$sort0 = 'de';
			$sort1 = 'en';
			$sortfallback = 'nameDe';
		}
...
		$sql .= sprintf(' ORDER BY CASE sprachen.id WHEN \'%s\' THEN \'0\' WHEN \'%s\' THEN \'1\' ELSE sprachen.%s END ASC, sachnr ASC',
			$sort0,
			$sort1,
			$sortfallback
		);

MySQL < 4.1 liefern nicht immer denselben Datentyp, entsprechend gibts Chaos beim Versuch numerische Werte und Zeichenketten zu sortieren, deshalb der Cast als '0' und '1'.
Und der Name der Sprache ist zur Sortierung besser geeignet als der ISO369 Code:
Ungarisch (hu)
Italienisch (it)
 
Oben