Sortierung innerhalb des Group_Concat

GoatMachine

Benutzer
Beiträge
23
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.auflagentitel, b.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.nachname, a.vorname
      ) AS t
GROUP BY buch_id, titel
ORDER BY autoren


Ausgabe:
problemsoj8y.jpg



Datenbankmodell:
db7kiyh.png
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Es geht...Ich komm nicht mehr klar -.- Das ich da nicht früher drauf gekommen bin....daaaanke.....vielen, vielen Dank :)

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

GoatMachine

Benutzer
Beiträge
23
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_id, auflagen_id,
      titel, Band
  FROM ( SELECT R.Name AS Reihen_Name, b.id AS buch_id, auf.id AS auflagen_id
                ifnull(auf.auflagentitel, b.originaltitel) AS titel,
                a.nachname,
                a.vorname, b.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.nachname, a.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_id, titel, Band
ORDER BY Reihen_Name, autoren, Band

Kann sein, das ich wieder irgendwas übersehe....

Gruß
 
Werbung:

GoatMachine

Benutzer
Beiträge
23
oO Wo kommt das denn her....

Jetzt nochmal ordentlicher:
PHP:
SELECT group_concat(nachname, ', ', vorname ORDER BY nachname SEPARATOR '; ') AS autoren,
      buch_id, auflagen_id,
      titel, Band
  FROM ( SELECT R.Name AS Reihen_Name, b.id AS buch_id, auf.id AS auflagen_id
                ifnull(auf.auflagentitel, b.originaltitel) AS titel,
                a.nachname,
                a.vorname, b.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.nachname, a.vorname, b.ErstVOE ASC,b.Band
      ) AS t
GROUP BY buch_id, auflagen_id, titel, Band
ORDER BY Reihen_Name, autoren, Band

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:
mit_order_by40bsf.jpg



Ohne ORDER BY Band:
ohne_order_by0wldz.jpg


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