SQL: Gruppieren + Sortieren?

... komplette Frage anzeigen

3 Antworten

Also wenn ich dich richtig verstehe, dann ist das etwas komplizierter, geht aber durchaus rein via SQL Abfrage, hier recht ausführlich erklärt: https://goo.gl/T1yCGY (oder auch: https://goo.gl/07OprR )

Alternativ, wenn auch sicher nicht optimal und je nach Menge der Datensätze mehr oder weniger ressourcenlastig, könntest du natürlich auch einmal mit "GROUP BY" (oder "DISTINCT") die IDs auslesen und dann in einer Schleife jeweils die 5 neusten mit einem "LIMIT" (sollte man normalerweise nicht machen, SQL-Queries innerhalb von Schleifen sollte man möglichst vermeiden, wenn es nicht allzu viele Daten sind, und die Abfrage ggf auch nicht sonderlich häufig ausgeführt werden soll, auf die Schnelle aber wohl die einfachere Variante).

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von MaxMeisterv2
24.11.2016, 21:41

http://code.openark.org/blog/mysql/sql-selecting-top-n-records-per-group

Das klingt gut, allerdings fehlt mir dazu das Wissen, um hier noch Anpassungen vorzunehmen.

Könntest Du mir die SQL Anfrage so formulieren, dass am Ende alle Spalten zurückgegegeben werden, welche in der Tabelle x sind?

Erst die Einträge jeweils nach der Spalte nummer in Pakete packen und dann in die Spalte Datum schauen und davon jeweils bis zu 5 Einträge absteigend nehmen.

Danke Dir auf jeden Fall so oder so schon mal!

0

Rein mit SQL ist das ziemlich schwierig. Mir fallen da nur folgende 2 Lösungsansätze ein, welche allerdings beide einen Haken haben:

SELECT * FROM Tabelle ORDER BY Nummer ASC, Datum DESC;

^ Hiermit werden nacheinander für jeden Spieler alle Einträge (absteigend nach Datum sortiert) ausgegeben. Der Haken ist, dass pro Spieler alle Einträge ausgegeben werden und nicht nur die neuesten 5.

SELECT Nummer, SUBSTRING_INDEX(GROUP_CONCAT(Punkte ORDER BY Datum DESC SEPARATOR ', '), ',', 5) as LetzteErgebnisse FROM Tabelle GROUP BY Nummer;

^ Hiermit werden für jeden Spieler die letzten 5 Ergebnisse (Punkte) ausgegeben, aber man sieht das jeweils zugehörige Datum nicht.

Komfortabler wäre es wohl, das mit einer kleinen PHP-Seite zu lösen. Macht sowieso Sinn, denn man will sich die Infos ja nicht immer auf Datenbankebene holen. Die PHP-Seite könnte im ersten Step per SQL alle vorkommenden Spielernummern ermitteln und dann in einer Schleife für jede Spielernummer die neuesten 5 Einträge abrufen. Ist vielleicht nicht die effizienteste Lösung, aber die einfachste.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von MaxMeisterv2
24.11.2016, 21:36

Hey Acdxx, erstmal vielen Dank für Deine ausführliche Antwort. Verstehen tue ich davon nicht viel. Habe es jetzt mal ausgeführt, aber die zwei Spalten reichen mir so nicht. Ich brauche den *, also alle Spalten der Tabelle. Da gibts übrigens noch mehr. Mit PHP möchte ich das ungerne machen, weil es ziemlich viele Einträge sind. Hast Du vllt noch ne Idee, wie ich als Ergebnis als Spalten der Tabelle bekomme?

0

Was hast du schon probiert und was daran funktioniert nicht?

Meinst du wir helfen dir ohne das du es versuchst?

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von MaxMeisterv2
24.11.2016, 19:45

Ich kenne mich in SQL so gut wie nicht aus. Daher habe ich auch keine Ansätze weiter geschrieben. Mache das auch nur für unseren Sportverein ehreamtlich :). Wir haben Spielergebnisse, welche ausgegeben werden sollen, aber eben nicht alle, weil das den Rahmen sprengt. Wir wollen pro Spieler immer nur die 5 neusten Einträge bekommen. Vielleicht ist es was mit GROUP BY, aber mehr weiß ich da auch nicht.

0

Was möchtest Du wissen?