Mysql top5 einer spaltenkombination einer abfrage

Hallo,

ich würde gerne aus einer SQL Abfrage die Top 5 eines spalten Ergebnissen haben.

Also die top 5 summe von Benutzer 40048, Benutzer 40066 etc.
Kann mir da einer weiter helfen :wink:

SQL-Ergebnis:

|id|benutzer|summe|
|3600|40048|16|
|3590|40048|14|
|3580|40048|14|
|3599|40048|13|
|3601|40048|13|
|3598|40048|11|
|3592|40048|10|
|3593|40048|10|
|3581|40048|10|
|3578|40048|8|
|3579|40066|7|
|3577|40066|7|
|3586|40066|5|
|3583|40066|5|
|3597|40066|3|
|3594|40066|3|
|3602|40066|3|
|3588|40066|3|
|3596|40066|2|
|3584|40066|2|
|3591|90048|1900|
|3582|90048|1325|
|3603|90048|1232|
|3589|90048|109|
|74|40115|827|
|458|40115|191|
|788|40115|184|
|91|40115|178|
|5905|40115|175|
|849|40115|146|
|153|40115|141|
|448|40115|137|

Hi,

wen interessiert das, außer dich? Sinnvoller wäre die Abfrage gewesen! Hier, such dir etwas Passendes aus: https://www.w3schools.com/sqL/sql_top.asp

Ich würd‘s mit limit 5 versuchen.

Gruß
Christa

Hallo Crista,
mit Limit bekomme ich nur die 5 ersten Einträge.
Das Ergebnis kommt aus einer Komplizierteren Abfrage die ich als subquery nehmen würde.

Hallo,
Die Syntax TOP 5 summe versteht mysql ja nicht. Von daher gibt’s keine Lösung. Steht aber alles auf der verlinkten Seite.

1 Like

Hallo,

ohne es getestet zu haben, ungefähr so:

SELECT benutzer,SUM(summe) FROM tabelle GROUP BY benutzer ORDER BY SUM(summe) DESC LIMIT 5;

Gruß,
Steve

Aber das ist nicht dasselbe wie TOP 5 summe FROM xxx GROUP BY benutzer

Hallo!

So, wie ich das sehe, soll die Tabelle weiterhin die Daten aller Benutzer enthalten, aber pro Benutzer maximal 5 Zeilen liefern

So ganz naiv habe ich das hier zusammengebastelt:

SELECT
	A.Id,
	A.benutzer,
	A.summe
FROM
	scratch.MyTable A
WHERE
	A.Id IN (
		SELECT
			B.Id
		FROM
			scratch.MyTable B
		WHERE
			A.benutzer = B.benutzer
		ORDER BY
			B.summe DESC
		LIMIT 5
	)
	

Von der Logik her sollte es passen.
Aber: MySQL kann kein LIMIT innerhalb von SubQueries -> Geht nicht!

Hi!

„Einfach“ geht es nicht, aaaaber das Ganze spricht eher für analytische Funktionen.
Andrerseits könnte auch noch der Ansatz passen, mit Views bzw. Sub-Selects in der From-Klausel zu hantieren.

Aber da ich grad selber genug zu tun hab und das herumswitchen zwischen MySql und Oracle nicht gerade förderlich ist, lass ich dir die Lösung aufgrund der hingeworfenen Brocken selber überlegen.

Grüße,
Tomh

Dann macht man halt einen inner join, da geht das. Oder eine temporäre Table in der man die ersten fünf Zeilen eines jeden Benutzers markiert, den Rest löscht und seine Abfrage dann darauf laufen lässt.

Magst du schreiben, was dir da vorschwebt?

Ansonsten kann man sicher über ein richtiges Script nachdenken. Andererseits heißt es, daß die Daten eh aus einer komplexeren Abfrage stammen. Da wäre dann die Frage, ob man nicht dort bereits was drehen kann.