MySQL Order By (komplex)
Michael H.
- datenbank
0 Daniel0 Michael H.0 Daniel0 Rouven0 Michael H.0 Rouven
Hi,
Ich hab folgendes Sortierungs-Problem:
Gegeben ist: Tabelle A (natürlich noch mehr spalten, aber diese beiden interessieren)
+----+------+
| ID | type |
+----+------+
| 1 | C |
| 2 | R |
| 3 | M |
| 4 | C |
| 5 | P |
| 6 | R |
+----+------+
Ich würde das ganze gerne auslesen und zwar sortiert nach spalte "type". ansich kein großes thema, allerdings will ich sie nicht alphabetisch sortieren und zwar in der reihenfolge C-R-P-M. Dies entspricht im Programm der Haufigkeit der Benutzung, ergo will ich die Datensätze, die am häufigsten benötigt werden zuerst sehen,...
Bis hierhin hab ich schonmal keine Ahnung wie das gehen soll. Verschräft wird das Ganze dadurch, dass über die ID noch eine andere Tabelle verknüoft ist, in der es eine Spalte "name" gibt. Nach Vorstellung von einigen Leuten hier wäre es der heilige Gral, wenn man zuerst die Sortierung nach "type" machen könnte und innerhalb der types eine sortierung (diesmal wenigstens alphabetisch) nach der spalte "name", also quasi C-name1,C-name5,C-name8,R-name2,R-name4,P-name3,P-name6,M-name7
hat irgendwer eine ahnung wie das gehen könnte (vielleicht auch nur problem 1, das hilft schonmal sehr)? Ich verwende MySQL 4.
Vielen vielen Dank,
Michael H:
Hi,
wenn man zuerst die Sortierung nach "type" machen könnte und
innerhalb der types eine sortierung (diesmal wenigstens alphabetisch)
nach der spalte "name", also quasi
C-name1,C-name5,C-name8,R-name2,R-name4,P-name3,P-name6,M-name7
na das ist ja "einfach". per inner join verknüpfst du die 2 tabellen
über die ID und beim ORDER BY dann tabelle_mit_namen.name nachdem
count(type)
MfG
Hi,
wenn man zuerst die Sortierung nach "type" machen könnte und
innerhalb der types eine sortierung (diesmal wenigstens alphabetisch)
nach der spalte "name", also quasi
C-name1,C-name5,C-name8,R-name2,R-name4,P-name3,P-name6,M-name7na das ist ja "einfach". per inner join verknüpfst du die 2 tabellen
über die ID und beim ORDER BY dann tabelle_mit_namen.name nachdem
count(type)
ähm, also das ist wohl nicht ganz klar geworden. die sortierung ist zunächst die "willkürliche" sortierung nach "type" (C-R-P-M) und dann "innerhalb" nach "name". Das Beispiel war wohl etwas unglücklich, kann nämlich durchaus sein dass es zu type R mehr gibt als zu type C. allerdings ist der type C der meistgenutzte, type R der zweitmeistgenutzte,...
hoffe es ist klarer geworden...
trotzdem schonmal danke fürs nachdenken
Hi,
na das ist ja "einfach". per inner join verknüpfst du die 2 tabellen
über die ID und beim ORDER BY dann tabelle_mit_namen.name nachdem
count(type)ähm, also das ist wohl nicht ganz klar geworden. die sortierung ist
zunächst die "willkürliche" sortierung nach "type" (C-R-P-M) und dann
"innerhalb" nach "name". Das Beispiel war wohl etwas unglücklich,
kann nämlich durchaus sein dass es zu type R mehr gibt als zu type C.
allerdings ist der type C der meistgenutzte, type R der
zweitmeistgenutzte,...hoffe es ist klarer geworden...
trotzdem schonmal danke fürs nachdenken
Mir ist das schon klar, du willst zunächst mal nach der häufigkeit des
benutzten types sortieren also ORDER BY count(type) oder so ähnlich
und dies kannst du wenn du ein INNER JOIN der anderen tabelle mit den
namen machst auf ORDER BY count(type), name erweitern, dann wird
zuerst nach der anzahl des Typs und darin diese dann jeweils nach dem
namen sortiert und du erhältst dein ergebniss.
MfG
Mir ist das schon klar, du willst zunächst mal nach der häufigkeit des
benutzten types sortieren
und genau HIER ist dein denkfehler ;-)
im programm werden datensätze des types "C" am häufigsten genutzt, was aber nicht bedeutet daß die meisten datensätze den typ C haben. sonst wäre es ja einfach....
Mann, ist ganz schön schwer das zu beschreiben. wie gesagt, am wichtigsten wäre dass ich die selbstdefinierte sortierung hinbekommen würde. die namen-verknüpfung ist dann das i-Tüpfelchen....
Merci trotzdem,
Michael
Hi,
vielleicht versteh ich euch auch jetzt beide nicht, aber wenn du auf einem beschränkten Bereich operierst (also z.B. nur die 4 Buchstaben), dann kannst du dir in der Abfrage mit IF oder CASE (sorry, gerade keine Syntax parat) eine Übersetzung vornehmen, so nach dem Motto "wenn das C ist dann 1, sonst wenn das R ist dann 2, sonst..." und dann diese Spalte mit "AS sort_col" benennen, die Sortierung dann per ORDER BY sort_col machen.
Wenn du nicht auf 4 Stück beschränkt bist, dann leg dir eine "Übersetzungstabelle" an, also eine Tabelle
Typ | ordernr
C | 1
R | 2
Joine in die Tabelle und sortiere nach der ordernr.
MfG
Rouven
Hi,
vielleicht versteh ich euch auch jetzt beide nicht, aber wenn du auf einem beschränkten Bereich operierst (also z.B. nur die 4 Buchstaben), dann kannst du dir in der Abfrage mit IF oder CASE (sorry, gerade keine Syntax parat) eine Übersetzung vornehmen, so nach dem Motto "wenn das C ist dann 1, sonst wenn das R ist dann 2, sonst..." und dann diese Spalte mit "AS sort_col" benennen, die Sortierung dann per ORDER BY sort_col machen.
Wenn du nicht auf 4 Stück beschränkt bist, dann leg dir eine "Übersetzungstabelle" an, also eine Tabelle
Typ | ordernr
C | 1
R | 2Joine in die Tabelle und sortiere nach der ordernr.
Du hast das absolut richtig verstanden und ich bin auch nur auf die 4 Buchstaben beschränkt. Ich werd mir die Sache mit IF mal anschauen (wusste gar nicht dass MySQL sowas kann...), um eine Sortierungstabelle versuche ich mal rumzukommen, ist für 4 Werte doch etwas zu viel finde ich.
Danke für die Anregung!
Michael
Also bei MySQL siehts laut http://dev.mysql.com/doc/mysql/en/case-statement.html so aus:
SELECT ...,
CASE
WHEN type = 'C' THEN 1
WHEN type = 'R' THEN 2
...
END CASE AS sort_col
FROM...
ORDER BY sort_col
MfG
Rouven
Also bei MySQL siehts laut http://dev.mysql.com/doc/mysql/en/case-statement.html so aus:
SELECT ...,
CASE
WHEN type = 'C' THEN 1
WHEN type = 'R' THEN 2
...
END CASE AS sort_col
FROM...
ORDER BY sort_col
Merci! Habs grade auch selbst gefunden gehabt ;-)
Allerdings muss das CASE nach dem END weg, sosnt gehts bei mir nicht.
Mann, bin ich glücklich. Jetzt kommt nur noch die Verknüpfung mit den Namen und dann ist alles gut. Aber das wird einfach...