Michael H.: MySQL Order By (komplex)

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:

  1. 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

    1. 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)

      ä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

      1. 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

        1. 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

      2. 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

        --
        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. 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.

          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

          1. 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

            --
            -------------------
            ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
            1. 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...