Ankündigung

Einklappen
Keine Ankündigung bisher.

MYSQL, GROUP BY Reihenfolge

Einklappen

Neue Werbung 2019

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

  • santana2000
    hat ein Thema erstellt MYSQL, GROUP BY Reihenfolge.

    MYSQL, GROUP BY Reihenfolge

    Hallo Jungs,

    Es geht um ein Select auf mysql.

    Wie kann ich das am einfachsten erklären... ..Die User sind in Kategorien unterteilt. Nun möchte ich pro Kategorie je einen User abrufen inkl. Bilder und Andere Infos, von denjenigen, der sich als letzter eingelogt hat.

    Das Problem ist, wenn ich GROUP BY category.id anwende, damit nur ein User pro Kategorie angezeigt wird, kann ich die Reihenfolge vor der Gruppierung nicht bestimmen.

    Die Reihenfolge wäre mit ORDER BY sessions.lastlogin DESC definiert.

    Diese aber nach der Gruppierung anzuwenden macht wenig Sinn, da die Gruppierung eben schon stattgefunden hat.

    Hier noch das Select, dass funktioniert, aber nicht nach lastlogin sortiert, sondern vermutlich nach der ID:
    PHP-Code:
    SELECT r.id_user,
           
    category.category,
           
    sessions.lastlogin,
           (
    SELECT r1.small FROM images AS r1 WHERE r.id_user r1.id_user ORDER BY RAND() LIMIT 1) AS 'img'
    FROM images AS r
    LEFT JOIN userstatus ON r
    .id_user userstatus.id_user
    LEFT JOIN category ON userstatus
    .id_category category.id
    LEFT JOIN sessions ON r
    .id_user sessions.id_user
    RIGHT JOIN kundendienstleistungen ON category
    .id kundendienstleistungen.id_category
    WHERE userstatus
    .profil_ready '1' AND category NOT IN ('freeUser')
    GROUP BY category.id
    ORDER BY category
    .id 
    Wer kann sagen wie aus GROUP BY bestimmt werden kann, welches element aus der Gruppe angezeigt werden soll?

    Danke für eure Hilfe.

    Gruss

  • akretschmer
    antwortet
    Zitat von santana2000 Beitrag anzeigen

    Deine Antwort ist mir aber diesmal eine Nummer zu gross! Das versteh ich nicht.

    Die richtige Lösung wäre wohl (vereinfacht), wenn Du je Kategorie den User erfragst (bzw. den neuesten Zeitpunkt) und dann einen Join machst. Also select kategorie, max(timestamp) group by kategorie, und dann mit diesem 2 Spalten joinen.
    In PG könntest Du distinct on(..) nehmen, aber das ist PG-spezifisch.

    Wenn Du Dein MySQL auf strict-Mode stellst bekommst, denke ich, auch einen Syntaxfehler. Es ist halt falsch, schlampig, schlecht.

    Einen Kommentar schreiben:


  • santana2000
    antwortet
    Alle Spalten im Result müssen entweder aggregiert oder gruppiert werden, nur das ist eindeutig.
    Hallo Akretschmer, es ist unfassbar wie schnell du meistens antwortest. Danke.

    Deine Antwort ist mir aber diesmal eine Nummer zu gross! Das versteh ich nicht.

    Wenn ich alles Gruppiere, erfüllt die Gruppierung bei mir nicht mehr den Zweck wofür ich es bis jetzt gebraucht habe.

    Auf jeden Fall habe ich hier was gebastelt was auch zu funktionieren scheint. ^^

    Siehe Subquery im FROM:
    PHP-Code:
    SELECT r.id_user
           
    category.id AS catid,
           
    category.category,
           (
    SELECT r1.small FROM images AS r1 WHERE r.id_user r1.id_user ORDER BY RAND() LIMIT 1) AS 'img' 
    FROM (SELECT images.id_userimages.small FROM images RIGHT JOIN sessions ON images.id_user sessions.id_user ORDER BY sessions.lastlogin DESC) AS 
    LEFT JOIN userstatus ON r
    .id_user userstatus.id_user 
    LEFT JOIN category ON userstatus
    .id_category category.id 
    RIGHT JOIN kundendienstleistungen ON category
    .id kundendienstleistungen.id_category 
    WHERE userstatus
    .profil_ready '1' AND category NOT IN ('freeUser')
    GROUP BY category.category
    ORDER BY catid 

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von santana2000 Beitrag anzeigen
    Wer kann sagen wie aus GROUP BY bestimmt werden kann, welches element aus der Gruppe angezeigt werden soll?

    Danke für eure Hilfe.

    Gruss
    Was Du machst ist ein Verstoß gegen die SQL-Regeln, nur MySQL wirft hier keinen Syntaxfehler und liefert ein Resultat, welches u.a. davon abhängt, ob der Sack Reis in China schon umgefallen ist oder nicht.

    Code:
    test=*# select * from foo;
     c1 | c2
    ----+----
      1 |  1
      2 |  2
    (2 rows)
    
    test=*# select * from foo group by c1;
    ERROR:  column "foo.c2" must appear in the GROUP BY clause or be used in an aggregate function at character 8
    STATEMENT:  select * from foo group by c1;
    ERROR:  column "foo.c2" must appear in the GROUP BY clause or be used in an aggregate function
    LINE 1: select * from foo group by c1;
                   ^
    Alle Spalten im Result müssen entweder aggregiert oder gruppiert werden, nur das ist eindeutig.

    Einen Kommentar schreiben:

Lädt...
X