SQL Richtig sortieren mit GROUP BY?

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
825
Hallo,

ich habe folgendes SQL-Query:

SQL:
SELECT count(*) AS anzahl, user_id, datum FROM activity WHERE status = 1 GROUP BY user_id ORDER BY anzahl DESC, datum DESC LIMIT 5

Der Datenbestand ist so, dass jede "user_id" mehrere Datensätze in der Tabelle "activity" hat. Das bedeutet auch, dass jeder Datensatz ein andere Datum (timestamp) hat. Nun möchte ich in diesem SQL-Query, dass bei der Ausgabe des Querys, dass Datum drin ist, was am Kürzesten zurück liegt. Und hatte folgendes versucht:

SQL:
SELECT count(*) AS anzahl, user_id, MAX(datum) FROM activity WHERE status = 1 GROUP BY user_id ORDER BY anzahl DESC, datum DESC LIMIT 5

Ich meine es so auch schon mal gemacht zu haben. Hat aber nicht den gewünschten Erfolg gebracht. Jemand eine Idee?

Ich nutze MYSQL 5.7
 
ORDER BY anzahl DESC, MAX(datum) DESC LIMIT 5
sonst wird ja mit datum etwas anderes sortiert als das select vorgibt
 
Ich bin von TSQL ausgegangen, dort kann ich aggregierte results nur nach Feldern sortieren die auch im SELECT statement vorkommen. Nachdem datum nicht mehr im SELECT statement vorkommt könnte das zum Problem werden. Vielleicht geht MySQL aber auch anders damit um.
 
Dein Problem ist, dass du in deinem ORDER BY nur Spalten verwenden kannst, die du auch gruppiert hast.


Mich verwirrt dein LIMIT 5 etwas? Willst du die letzten 5 Activities pro Benutzer haben? Oder pro Benutzer eine Activity, aber maximal 5 Datensätze?


Ich würde eine Unterabfrage bauen, die die Anzahl an Datensätze mit größerem Datum pro Benutzer ermittelt. Dann kannst du einfach Filtern :


SQL:
SELECT
    a.user_id,
    u.name AS user_name,
    a.datum,
    a.status
FROM
    Activity a
JOIN
    Users u ON a.user_id = u.user_id
WHERE
    (
        SELECT
            COUNT(*)
        FROM
            Activity a2
        WHERE
            a2.user_id = a.user_id
            AND a2.datum >= a.datum
    ) <= 5
ORDER BY
    a.user_id,
    a.datum DESC;
https://www.db-fiddle.com/f/5bZ1EfsFtHqr61kyreQqRn/0


Falls du pro Benutzer nur den letzten Datensatz benötigst, ginge auch folgendes :
SQL:
SELECT
    user_id,
    MAX(datum) AS letztes_datum
FROM
    Activity
WHERE
    status = 1
GROUP BY
    user_id
 
Zuletzt bearbeitet: (Ergänzung)
Blöder Fehler. Habe die Lösung heute gefunden.

SQL:
SELECT count(*) AS anzahl, user_id, MAX(datum) AS datums FROM activity WHERE status = 1 GROUP BY user_id ORDER BY anzahl DESC, datums DESC LIMIT 5

Ich danke euch trotzdem.
 
Zurück
Oben