Ankündigung

Einklappen
Keine Ankündigung bisher.

ORDER BY mal komplizierter

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ORDER BY mal komplizierter

    Hallo,

    ich würde gerne nach mehreren Feldern auf folgende Weise sortieren:

    feld2 ist die Spalte, dessen Werte, wenn sie denn gleich sind, stets Gruppenweise zusammenstehen sollen.

    feld1 gibt die Sortierung in der Tabelle vor. Hierbei zählt der größte oder kleinste Wert von der Gruppe, die aus feld2 entsteht, je nachdem ob man ASC oder DESC sortiert.

    Ein Beispiel: <feld1, feld2>

    Vor der Sortierung:

    Thomas, 23
    Marcel, 23
    Sandra, 17
    Ramon, 20
    Dieter, 17

    Nach der Sortierung nach feld1:

    Dieter, 17
    Sandra, 17
    Marcel, 23
    Thomas, 23
    Ramon, 20

    Dieter kommt zuerst, weil D der erste Buchstabe ist.
    Sandra kommt als zweites, weil sie durch den gleichen Wert 17 an Dieter gebunden ist.
    Marcel kommt als nächstes, da M von den übrigen Werten der nächste Buchstabe ist. Thomas ist ebenfalls wieder durch sein Alter an Marcel gebunden.
    Zuletzt kommt Ramon, da R der nächste Buchstabe der verbleibenden Werte ist.

    Es soll dabei mehrere Felder wie feld1 geben können.

    Ist etwas kompliziert, ich versuche es schon seit einigen Wochen und bekomme es einfach nicht hin.

    Grüße


  • #2
    Meiner Meinung nach macht diese Sortierung keinen Sinn. Eher würde eine Sortierung nach dem Alter und dann die Sortierung nach den Namen passen. Also die Gruppen sind die einzelnen Altersstufen und dann pro Stufe dann sortiert die Namen. Anders machts irgendwie keinen Sinn oder?

    Ansonsten würde ich an deiner Stelle eben die Sortierung in PHP vornehmen. Mit SQL alleine denke ich nicht dass das so leicht machbar ist.

    Kommentar


    • #3
      Ein gruppenweises Sortieren gibt es so nicht. Du könntest GROUP_CONCAT verwenden und Dir in PHP was basteln. Eine andere Lösung sehe ich nicht.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Zitat von Flor1an Beitrag anzeigen
        Meiner Meinung nach macht diese Sortierung keinen Sinn.
        Es war nur ein Beispiel. Es geht dabei um Züge und Wagons, dort macht es einen Sinn

        Zitat von nikosch
        Ein gruppenweises Sortieren gibt es so nicht. Du könntest GROUP_CONCAT verwenden und Dir in PHP was basteln. Eine andere Lösung sehe ich nicht.
        Mist. Das ist echt ärgerlich. Hab schon viel ins Drumherum gesteckt in der Hoffnung, ich kann es in SQL lösen. Das Drumherum ist Java und die doofen JTables, von daher ist das net so easy mit der anderen Lösung.

        Trotzdem thanks.

        Kommentar


        • #5
          Zitat von Dreamdancer Beitrag anzeigen
          Es war nur ein Beispiel. Es geht dabei um Züge und Wagons, dort macht es einen Sinn
          Vielleicht erläuterst du deine Problemstellung mal, wie sie in Wirklichkeit IST, nicht anhand eines Beispiels... eventuell ergibt sich ja doch etwas sinnvolles daraus.
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Fällt mir folgendes dazu ein

            Code:
            CREATE TABLE test_sort (
             name VARCHAR(50) NOT NULL,
             group_id INT NOT NULL
            );
            
            INSERT INTO test_sort VALUES
            ('Thomas', 23),
            ('Marcel', 23),
            ('Sandra', 17),
            ('Ramon', 20),
            ('Dieter', 17);
            
            
            SELECT ts.name, ts.group_id
              FROM test_sort ts
              LEFT JOIN ( SELECT group_id, COUNT(*) AS anzahl, MIN(name) AS gruppe_name 
                       FROM test_sort
                      GROUP BY group_id
                     HAVING COUNT(*) > 1 
                   ) gruppe
                ON ts.group_id = gruppe.group_id
            
            ORDER BY CASE COALESCE(gruppe.anzahl,1)
                      WHEN 1 THEN name
                      ELSE CONCAT(gruppe_name, name) 
                     END;
            
            +--------+----------+
            | name   | group_id |
            +--------+----------+
            | Dieter |       17 |
            | Sandra |       17 |
            | Marcel |       23 |
            | Thomas |       23 |
            | Ramon  |       20 |
            +--------+----------+
            5 rows in set (0.00 sec)
            
            mysql>
            Grüße
            Thomas

            Kommentar


            • #7
              Also die Tabelle ist 20 Spalten lang und beinhaltet teils numerische, teils alphanumerische Werte (immer spaltenweise abgegrenzt).

              Eine Zeile stellt ein Element eines Zuges (Wagon oder Triebfahrzeug) dar.

              Das Feld, dass die Gruppen bildet (im Beispiel die Zahl), ist eine Fahrzeuggruppennummer, in der Wagons und Triebfahrzeuge zusammengefasst werden, die zusammen fahren. Deshalb sollen die immer gruppiert werden bzw. untereinander stehen.
              Die anderen Spalten sind diverse Informationen, nach denen sortiert werden soll, aich priorisiert. Also man soll auf dem JTable-Header mehrere Spalten anklicken können und die werden dementsprechend geordnet (SORT BY feld1 ASC, SORTY BY feld2 ASC, SORTY by feld3 DESC) usw.

              Das wichtige ist, dass identische Fahrzeuggruppennummern immer untereinander stehen bleiben.

              Kommentar


              • #8
                Zitat von Dreamdancer Beitrag anzeigen
                Also die Tabelle ist 20 Spalten lang und beinhaltet teils numerische, teils alphanumerische Werte (immer spaltenweise abgegrenzt).
                Liefere doch einfach mal ein konkretes oder ähnliches Beispiel (CREATE TABLE) plus ein paar Testdaten, sowie das gewünschte Ergebnis. Dann findet sich wahrscheinlich auch eine Lösung. Mit teils-teils Vorgaben, läßt sich kein Projekt machen. Eine "teils-teils" Lösung findest Du ja schon mit meiner Antwort #6 auf Deine Frage #1.

                Grüße
                Thomas

                Kommentar


                • #9
                  Ok, ein Datenbeispiel. Aber ich erhalte die Daten aus einer zeimlich ziemlich langen SQL-Verwurschtelung und möchte deshalb nur auf dem Ergebnis arbeiten und nicht in die bisherige SQL-Abfrage eingreifen (musste die übernehmen). Das Resultat aus dieser Verwurschtelung ist diese Tabelle.

                  Code:
                  CREATE TABLE sample_table (
                  
                  datum varchar(12) NOT NULL,
                  laufplan varchar(6) NOT NULL,
                  umlauftag int NOT NULL,
                  fahrzeugtyp int NOT NULL,
                  fahrzeug varchar(20) NOT NULL,
                  anfangsort varchar(6) NOT NULL,
                  fahrtnummerAnfang varchar(6) NOT NULL,
                  position varchar(6),
                  sollAbfahrt varchar(10),
                  istAbfahrt varchar(10),
                  istAnkunft varchar(10),
                  sollAnkunft varchar(10),
                  fahrtnummerEnde varchar(6) NOT NULL,
                  positionEnde varchar(6),
                  endeOrt varchar(6) NOT NULL,
                  bemerkung varchar(50),
                  ausfallgrund varchar(50),
                  einsatzeinschränkung varchar(50),
                  fristRestKM int NOT NULL,
                  kmFrist int
                  );
                  
                  INSERT INTO sample_table VALUES
                  ('19.05.2010', '61101' , 1, 0  , 'U80 61 101/03', 'ZDW', 'K'    , ''   , '00:15:00', NULL, NULL, '03:00:00', 'K'    , ''   , 'ZDW', '', '', '', 15226, 0),
                  ('19.05.2010', '61101' , 1, 0  , 'U80 61 404/01', 'ZDH', 'K'    , ''   , '00:15:00', NULL, NULL, '03:00:00', 'K'    , ''   , 'ZDW', '', '', '', 4561 , 0),
                  ('19.05.2010', 'REB218', 2, 218, '218420'       , 'ZDW', '15369', 'WX' , '04:12:00', NULL, NULL, '04:42:00', '15369', 'WX' , 'ZDP', '', '', '', 2561 , 0),
                  ('19.05.2010', '61101' , 2, 0  , 'U80 61 101/02', 'ZDW', '15369', '1AT', '04:12:00', NULL, NULL, '04:42:00', '15369', '1AT', 'ZDP', '', '', '', 3372 , 0),
                  ('19.05.2010', 'REB423', 5, 423, '423406'       , 'ZDH', '6038' , ''   , '04:47:00', NULL, NULL, '05:02:00', '6038' , ''   , 'ZDW', '', '', '', 14618, 0),
                  ('19.05.2010', '61202' , 1, 0  , 'U80 61 202/01', 'ZDH', '15734', '1AS', '05:00:00', NULL, NULL, '05:47:00', '15734', '1AS', 'ZDS', '', '', '', 12142, 0),
                  ('19.05.2010', 'REA146', 1, 146, '146119'       , 'ZDH', '15734', 'WZ' , '05:00:00', NULL, NULL, '05:47:00', '15734', 'WZ' , 'ZDS', '', '', '', 14562, 0),
                  ('19.05.2010', '61101' , 1, 0  , 'U80 61 101/01', 'ZDW', '15371', '1AT', '05:12:00', NULL, NULL, '05:42:00', '15371', '1AT', 'ZDP', '', '', '', 26079, 0);

                  Kommentar


                  • #10
                    Zitat von Dreamdancer Beitrag anzeigen
                    Ok, ein Datenbeispiel.
                    Schön, das ist die eine Hälfte des geforderten.
                    Und jetzt lieferst du bitte noch die zweite.

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Schön, das ist die eine Hälfte des geforderten.
                      Und jetzt lieferst du bitte noch die zweite.
                      Wenn ich das zweite hätte, würde ich hier nicht fragen

                      Also diese Daten würde ich gerne so sortieren, dass ich nach jeder beliebeigen Spalte oder mehreren Spalten sortieren kann, ohne die Gruppierung nach dem Wert FahrtnummerAnfang zu verlieren (Gruppierung nicht im Sinne von GROUP BY sondern das Problem wie im Thread beschrieben). Die Sortierung nach mehreren Spalten ist wie gesagt kein Problem, aber die Gruppierung zu erhalten...
                      Ich kann es nicht durch ein einfaches SORT BY fahrtnummerAnfang lösen, da er mir sonst die gewünschte Sortierung nach sagen wir mal abfahrtSoll zerstört

                      Ok sagen wir mal ich möchte folgendermaßen sortieren:
                      SORT BY fahrzeugtyp ASC, fristRestKM ASC

                      Dann geht mir die "Gruppierung" nach fahrtnummerAnfang verloren, bei der ich ja möchte, dass alle Werte zusammen bleiben, aber die restliche Sortierung trotdem verfolgt wird wie im Beispiel mit den Namen.

                      Kommentar


                      • #12
                        Zitat von Dreamdancer Beitrag anzeigen
                        Wenn ich das zweite hätte, würde ich hier nicht fragen
                        Verflixt noch mal, du sollst die Ausgabedaten des Wunsch-Ergebnisses posten, die du bei deinen Beispiel-Eingabedaten gerne hättest.

                        Wenn du die noch nicht mal hast - dann bist du noch gar nicht so weit, dass dein Problem einer hier Diskussion würdig wäre.

                        Kommentar


                        • #13
                          Nun mal ruhig Blut. Das Ergebnis hängt davon ab, nach was man sortieren möchte. Ich habe sicher nicht ausreichend spezifiziert, um einen Vertrag zur Fertigung eines Algorithmusses abzuschließen, aber ich denke zu verstehen war es schon, was ich möchte.

                          Also ich sortiere nach laufplan und rauskommen soll:

                          Code:
                          "19.05.2010";"61101";"1";"0";"U80 61 101/03";"ZDW";"K";;"00:15:00";NULL;NULL;"03:00:00";"K";;"ZDW";;;;"15226";"0"
                          "19.05.2010";"61101";"1";"0";"U80 61 404/01";"ZDH";"K";;"00:15:00";NULL;NULL;"03:00:00";"K";;"ZDW";;;;"4561";"0"
                          
                          "19.05.2010";"61101";"2";"0";"U80 61 101/02";"ZDW";"15369";"1AT";"04:12:00";NULL;NULL;"04:42:00";"15369";"1AT";"ZDP";;;;"3372";"0"
                          "19.05.2010";"REB218";"2";"218";"218420";"ZDW";"15369";"WX";"04:12:00";NULL;NULL;"04:42:00";"15369";"WX";"ZDP";;;;"2561";"0"
                          
                          "19.05.2010";"61101";"1";"0";"U80 61 101/01";"ZDW";"15371";"1AT";"05:12:00";NULL;NULL;"05:42:00";"15371";"1AT";"ZDP";;;;"26079";"0"
                          
                          "19.05.2010";"61202";"1";"0";"U80 61 202/01";"ZDH";"15734";"1AS";"05:00:00";NULL;NULL;"05:47:00";"15734";"1AS";"ZDS";;;;"12142";"0"
                          
                          "19.05.2010";"REA146";"1";"146";"146119";"ZDH";"15734";"WZ";"05:00:00";NULL;NULL;"05:47:00";"15734";"WZ";"ZDS";;;;"14562";"0"
                          
                          "19.05.2010";"REB423";"5";"423";"423406";"ZDH";"6038";;"04:47:00";NULL;NULL;"05:02:00";"6038";;"ZDW";;;;"14618";"0"
                          Ich habe mal jeden Block in einen eigenen Abschnitt gesetzt, so kann man zudem besser sehen, wo die Sortierung einmal unterbrochen wurde, um der Gruppierung zu weichen.

                          Achtung Abstraktion: Wenn mann nach anderen Spalten oder mehreren Spalten sortiert, können andere Ergebnisse rauskommen.

                          Kommentar


                          • #14
                            Zitat von Dreamdancer Beitrag anzeigen
                            Also ich sortiere nach laufplan und rauskommen soll:
                            Wenn nach laufplan und fahrnummerAnfang sortiert ist, soll dies herauskommen, wenn ich die Ergebnisausgabe richtig verstanden habe:

                            Code:
                            +------------+-------------------+
                            | laufplan   | fahrtnummerAnfang |
                            +------------+-------------------+
                            | 61101      | K                 |
                            | 61101      | K                 |
                            +------------+-------------------+
                            | 61101      |             15369 |
                            | REB218     |             15369 |
                            +------------+-------------------+
                            | 61101      |             15371 |
                            ....
                            ....
                            Nach welcher Regel wird der Wert "K" in fahrtnummerAnfang vor 15369 sortiert?


                            Grüße
                            Thomas

                            Kommentar


                            • #15
                              "K" heißt Kaltblock und damit hat dieses Element eines Zuges nichts zu tun, steht irgendwo auf einem Abstellgleis.

                              Ich sortiere in dem Beispiel nach laufplan und nicht nach fahrtnummerAnfang. Wenn mich eine Sortierung nach fahrtnummerAnfang der Lösung näher bringen würde, ok. Das hier soll das Resultat sein, wenn ich nach laufplan sortiere. Wie das clustern von fahrtnummerAnfang zu bewerkstelligen ist, weiß icht nicht. Sortierung geht nicht, weil es mir dann die anderen Sortierungen zerschießt.

                              Hierbei gibt es keine Regel, warum K davor steht. Es ist nicht relevant für mein Problem. Ich habe das Ergebnis so zusammengesucht, dass ich die Reihenfolge nach dem Laufplan angepasst habe. In den Ausgangsdaten waren die beiden Ks hat ganz oben. Ich denke, wenn ich auch nach fahrtnummerAnfang sortieren würde, müssten die Ks hinter den Zahlen stehen. Aber wie gesagt, es wurde nur nach laufplan sortiert.

                              Kommentar

                              Lädt...
                              X