Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

[gelöst] MySQL: exotische Sortierung

Alles rund um die Systemverwaltung, die Administration und Konfiguration Eures Linuxsystems

Moderator: Moderatoren

Antworten
Benutzeravatar
panamajo
Guru
Guru
Beiträge: 2587
Registriert: 12. Feb 2005, 22:45

[gelöst] MySQL: exotische Sortierung

Beitrag von panamajo » 15. Feb 2006, 18:57

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?
Zuletzt geändert von panamajo am 16. Feb 2006, 13:53, insgesamt 1-mal geändert.

Werbung:
ninguno
Member
Member
Beiträge: 71
Registriert: 4. Dez 2005, 21:04

Beitrag von ninguno » 16. Feb 2006, 08:01

in mysql 5 ginge es, z.b für deutsch:

Code: Alles auswählen

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
religion is a virus from outer space

Benutzeravatar
panamajo
Guru
Guru
Beiträge: 2587
Registriert: 12. Feb 2005, 22:45

Beitrag von panamajo » 16. Feb 2006, 13:50

Super!
Mit ein wenig type-juggling gehts auch mit MySQL 3.23.*:

Code: Alles auswählen

		// 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)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast