mit left join nur den letzten Eintrag gruppieren

apophis171

Benutzer
Beiträge
22
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 :)
 
Werbung:
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
 
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​
 
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;
 
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?
 
Werbung:
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)
 
Zurück
Oben