Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Sortierung innerhalb des Group_Concat

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von GoatMachine, 3 April 2013.

  1. GoatMachine

    GoatMachine Benutzer

    Hallo,

    so langsam bin ich echt verzweifelt. Alles mögliche funktioniert nicht richtig. Vielleicht habt ihr ja eine Idee.

    Aufgabe:
    Eine dynamische Sortierung zu realisieren. Im Frontend selber sind noch Auswahlmöglichkeiten wie, "Nach Erscheinungsjahr, Nach Nachname,...." usw.

    Problem:
    Sieht man unten auf dem Screen: Bücher mit doppelten Autoren, werden auseinander gerissen.

    Ich hoffe ihr habt eine Idee und könnt mir helfen ;-) Danke im voraus.

    SQL-Befehl:
    PHP:
    SELECT group_concat(nachname', 'vorname SEPARATOR '; ') AS autoren,
          
    buch_id,
          
    titel
      FROM 
    SELECT b.id AS buch_id,   
                    
    ifnull(auf.auflagentitelb.originaltitel) AS titel,
                    
    a.nachname,
                    
    a.vorname
              FROM User u
    ,   
                    
    Sammlung s,   
                    
    Auflage auf,   
                    
    Buecher b,   
                    
    AutorenBuecher ab,   
                    
    Autoren a
              WHERE u
    .id 2
                
    AND u.id s.user_id
                
    AND s.auflagen_id auf.id
                
    AND auf.buecher_id b.id
                
    AND b.id ab.buecher_id
                
    AND ab.autoren_id a.id
              ORDER BY a
    .nachnamea.vorname
          
    ) AS t
    GROUP BY buch_id
    titel
    ORDER BY autoren

    Ausgabe:
    [​IMG]


    Datenbankmodell:
    [​IMG]
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Tja, MySQL halt, gell?

    schau mal in die Doku zu group_concat, beim flüchtigen lesen fiel mir da eine order by - Option auf ...
     
    GoatMachine gefällt das.
  3. GoatMachine

    GoatMachine Benutzer

    Es geht...Ich komm nicht mehr klar -.- Das ich da nicht früher drauf gekommen bin....daaaanke.....vielen, vielen Dank :)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Macht nix. Kannst ja mal auf 'Gefällt mir' drücken, wenn ich Dir geholfen habe ...
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Nachtrag dazu: immer dann, wenn kein ORDER BY angegeben ist, steht es der DB frei, die Daten in beliebiger Reihenfolge auszugeben. Das ist eine Möglichkeit der Optimierung.

    Beispiel PostgreSQL: das hat ein Feature namens 'synchronized scans'. Angenommen sei eine sogar physisch sortierte Tabelle mit Zahlen 1 bis 1 Million. Ein 'select * from table' wird diese Zahlen also sortiert ausgeben, oder?

    Nein, nicht zwingend.

    Wenn man allein auf der DB ist, wird das (vielleicht) sortiert rausfallen. Ist man nicht allein, kann es passieren, daß meine Abfrage gerade bei 999000 ist und mit 999001 weitermachen will. In diesem Moment kommt ein andere Client und fragt exakt dasselbe ab. Die DB erkennt dies und wird an den anderen Client die Zahlen 999001 bis 1000000 liefern, da diese bei 'meinem' Durchlauf halt gerade von der Platte gekratzt werden. Ist das durch, merkt die DB, daß da ja noch was fehlt und liefert dem anderen Client die Zahle 1 bis 999000 aus.

    2 Clients bekommen also dieselben Daten, aber in unterschiedlicher Reihenfolge. Je nachdem, in welchem zeitlichen Muster man abfragt und wie die DB halt grad so drauf ist.


    Datenbanken arbeiten mit Mengen. Eine Menge von Dingen wie z.B. ein Haufen Sand ist nun mal von Natur aus nicht sortiert. Sortierung ist teuer. Nie drauf verlassen, daß die DB da großzügig ist ;-)
     
  6. GoatMachine

    GoatMachine Benutzer

    Ah okay, das wusste ich bisher auch noch nicht.

    Hast du eine Idee, warum manche Spalten bei ORDER BY ignoriert werden? Speziell bei diesem SQL, hier wird "BAND" ignoriert und die Ausgabe ist 20, 1 anstelle 1, 20...:

    PHP:
    SELECT group_concat(nachname', 'vorname ORDER BY nachname SEPARATOR '; ') AS autoren,
          
    buch_idauflagen_id,
          
    titelBand
      FROM 
    SELECT R.Name AS Reihen_Nameb.id AS buch_idauf.id AS auflagen_id
                    ifnull
    (auf.auflagentitelb.originaltitel) AS titel,
                    
    a.nachname,
                    
    a.vornameb.Band
              FROM Reihe R
                    User u

                    
    Sammlung s
                    
    Auflage auf
                    
    Buecher b
                    
    AutorenBuecher ab
                    
    Autoren a
              WHERE u
    .id 2
                
    AND u.id s.user_id
                
    AND s.auflagen_id auf.id
                
    AND auf.buecher_id b.id
                
    AND b.id ab.buecher_id
                
    AND ab.autoren_id a.id
               
    AND b.Reihen_ID R.ID
              ORDER BY a
    .nachnamea.vorname, [SIZE=12px][FONT=Consolas][COLOR=#000000]b[/COLOR][/FONT][/SIZE][SIZE=12px][FONT=Consolas][COLOR=#66cc66].[/COLOR][/FONT][/SIZE][SIZE=12px][FONT=Consolas][COLOR=#000000]ErstVOE [/COLOR][/FONT][/SIZE][SIZE=12px][FONT=Consolas][B][COLOR=#993333]ASC[/COLOR][/B][/FONT][/SIZE][SIZE=12px][FONT=Consolas][COLOR=#66cc66],[/COLOR][/FONT][/SIZE][SIZE=12px][FONT=Consolas][COLOR=#000000] b[/COLOR][/FONT][/SIZE][SIZE=12px][FONT=Consolas][COLOR=#66cc66].[/COLOR][/FONT][/SIZE][SIZE=12px][FONT=Consolas][COLOR=#000000]Band[/COLOR][/FONT][/SIZE]
          
    ) AS t
    GROUP BY buch_id
    auflagen_idtitelBand
    ORDER BY Reihen_Name
    autorenBand
    Kann sein, das ich wieder irgendwas übersehe....

    Gruß
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Vermutlich übersehe ich augfrund Deines Quältextes da mit Size, Font, Color und anderen Geschwüren auch grad was ;-)
    Das innere ORDER BY kommt mir aber überflüssig vor.
     
  8. GoatMachine

    GoatMachine Benutzer

    oO Wo kommt das denn her....

    Jetzt nochmal ordentlicher:
    PHP:
    SELECT group_concat(nachname', 'vorname ORDER BY nachname SEPARATOR '; ') AS autoren,
          
    buch_idauflagen_id,
          
    titelBand
      FROM 
    SELECT R.Name AS Reihen_Nameb.id AS buch_idauf.id AS auflagen_id
                    ifnull
    (auf.auflagentitelb.originaltitel) AS titel,
                    
    a.nachname,
                    
    a.vornameb.Band
              FROM Reihe R
                    User u
    ,
                    
    Sammlung s,
                    
    Auflage auf,
                    
    Buecher b,
                    
    AutorenBuecher ab,
                    
    Autoren a
              WHERE u
    .id 2
                
    AND u.id s.user_id
                
    AND s.auflagen_id auf.id
                
    AND auf.buecher_id b.id
                
    AND b.id ab.buecher_id
                
    AND ab.autoren_id a.id
              
    AND b.Reihen_ID R.ID
              ORDER BY a
    .nachnamea.vornameb.ErstVOE ASC,b.Band
          
    ) AS t
    GROUP BY buch_id
    auflagen_idtitelBand
    ORDER BY Reihen_Name
    autorenBand
    Kann sein, das habe ich noch nicht genau getestet. Aber auch wenn ich den inneren Order By entferne, ändert das leider noch nichts an dem Problem, das Band ignoriert wird.


    Edit.:
    Auch interessant:

    Mit ORDER BY Band:
    [​IMG]


    Ohne ORDER BY Band:
    [​IMG]

    Wie man erkennt, bei beiden ist die Sortierung falsch, aber irgendwas wird trotzdem sortiert.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden