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

mit left join nur den letzten Eintrag gruppieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von apophis171, 6 April 2021.

  1. apophis171

    apophis171 Benutzer

    Hallo Gruppe :)

    Ich habe eine User Tabelle und zu jedem User gibt es eine Statistik. Ich möchte nun alle user abfragen und den LETZTEN Wert derer Statistik ebenfalls. Bekommen tue ich aber immer nur den ersten Wert. Folgendes query nutze ich:

    SELECT
    user.ID,user.alias,user.login,user_statistik.login
    FROM
    user_statistik
    LEFT JOIN
    user ON user_statistik.userID = user.ID
    GROUP BY user.alias

    DAS ich was falsch mache, das weiß ich, aber WAS mache ich falsch? Wenn die Datenbankstrucktur hier benötigt wird, poste ich sie natürlich :)
     
  2. Dukel

    Dukel Datenbank-Guru

    Woher soll das ganze wissen, was das erste und was das letzte ist?
    Tipp: ORDER BY
     
  3. apophis171

    apophis171 Benutzer

    Macht exakt das selbe:

    SELECT
    user.ID,user.alias,user.login,user_statistik.login
    FROM
    user_statistik
    LEFT JOIN
    user
    ON
    user_statistik.userID = user.ID
    GROUP BY
    user.ID
    ORDER BY
    user_statistik.login ASC oder DESC
     
  4. akretschmer

    akretschmer Datenbank-Guru

    dürfen wir die Tabellenstruktur, die Datentypen etc. erraten? Welcher letzter Wert? Zeitlich? Haben wir einen Timestamp?
     
  5. apophis171

    apophis171 Benutzer

    Der letzte Datentyp ist DATETIME (mit Timestamps hab ich mir irgendwann mal abgewöhnt).

    Ich hab die Tabelle user:
    ID (primery) | GroupID | FavID | alias (varchar) | keyID | password | login (bool) | autologin | autologout​
    und user_statistik:
    ID (primery) | userID | login (datetime) | logout​
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Code:
    edb=> create table t_user(id int generated always as identity primary key, alias text);
    CREATE TABLE
    edb=*> create table t_statistik(id int generated always as identity primary key, user_id int references t_user, login timestamp);
    CREATE TABLE
    edb=*> insert into t_user (alias) values ('foo');
    INSERT 0 1
    edb=*> insert into t_user (alias) values ('bar');
    INSERT 0 1
    edb=*> insert into t_user (alias) values ('batz');
    INSERT 0 1
    edb=*> insert into t_statistik (user_id, login) values (1, '2021-01-01');
    INSERT 0 1
    edb=*> insert into t_statistik (user_id, login) values (1, '2021-02-01');
    INSERT 0 1
    edb=*> insert into t_statistik (user_id, login) values (1, '2021-03-01');
    INSERT 0 1
    edb=*> insert into t_statistik (user_id, login) values (2, '2021-03-01');
    INSERT 0 1
    edb=*> insert into t_statistik (user_id, login) values (3, '2021-04-01');
    INSERT 0 1
    edb=*> select u.id, u.alias, s.login from t_user u left join (select user_id, max(login) as login from t_statistik group by user_id) s on u.id=s.user_id;
     id | alias |       login       
    ----+-------+--------------------
      1 | foo   | 01-MAR-21 00:00:00
      2 | bar   | 01-MAR-21 00:00:00
      3 | batz  | 01-APR-21 00:00:00
    (3 rows)
    
    edb=*>
    
    select kaffee;
     
  7. apophis171

    apophis171 Benutzer

    Perfekt. Genau das habe ich gesucht. Vielen lieben Dank @akretschmer :)
     
    akretschmer gefällt das.
  8. apophis171

    apophis171 Benutzer

    Ich muss den Thread nochmal aufmachen. Soweit stimmt alles. Ich habe auch halbwegs die Syntax verstanden. Allerdings möchte ich das "Ergebnis" nach 2 Kriterien sortieren.

    Hier mein angepasster Code:
    Code:
    SELECT 
        u.ID,u.alias,u.login,s.login,s.logout 
    FROM 
        user u 
    LEFT JOIN 
        (
            SELECT 
                userID, MAX(login) AS login, MAX(logout) AS logout 
            FROM 
                user_statistik 
            GROUP BY 
                userID
        ) s 
    ON 
        u.ID=s.userID
    ORDER BY 
        s.login 
    DESC
    
    Mit ORDER BY s.login bekomme ich (wie gewollt) alle eingeloggten an erster Stelle. Gibt es jetzt über SQL noch die Möglichkeit, die restlichen User (also, die nicht angemeldet sind) nach Alphabet UNTER den angemeldeten User zu sortieren?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    hab noch user ergänzt und:

    Code:
    edb=# select * from t_user;
     id | alias  
    ----+--------
      1 | foo
      2 | bar
      3 | batz
      4 | blubb
      5 | a_user
      6 | x_user
      7 | b_user
    (7 Zeilen)
    
    edb=# select u.id, u.alias, s.login from t_user u left join (select user_id, max(login) as login from t_statistik group by user_id) s on u.id=s.user_id order by s.login nulls last, alias;
     id | alias  |       login       
    ----+--------+--------------------
      2 | bar    | 01-MAR-21 00:00:00
      1 | foo    | 01-MAR-21 00:00:00
      3 | batz   | 01-APR-21 00:00:00
      5 | a_user |
      4 | blubb  |
      7 | b_user |
      6 | x_user |
    (7 Zeilen)
    
    
     
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