Doppeltes Gruppieren mit GROUP BY klappt nicht

Hallo,
ich habe ein Problem mit einer MySQL-Abfrage. Es geht um eine Datenbank mit „Kampfberichten“ aus einem Browsergame zu der ich ein paar Statistiken erstellen möchte.

Dazu möchte ich folgene Abfrage durchführen:

SELECT * FROM
(SELECT zielinhaber_allianz AS opfer, SUM(verteidiger_boni_verlust_mp ) AS mp_verlust_summe , count( pilot_name ) AS anz, sum( verteidiger_boni_verlust_mp ) / count( pilot_name ) AS durchschnitt
FROM kb_liste
WHERE pilot_allianz LIKE ‚xXx‘
AND angreifer_gewinnt =1
GROUP BY opfer
UNION
SELECT pilot_allianz AS opfer, SUM( angreifer_verlust_mp ) AS mp_verlust_summe , count( pilot_name ) AS anz, sum( angreifer_verlust_mp ) / count( pilot_name ) AS durchschnitt
FROM kb_liste
WHERE zielinhaber_allianz LIKE ‚xXx‘
AND angreifer_gewinnt =0
GROUP BY opfer ) as tmp
GROUP BY opfer
ORDER BY mp_verlust_summe DESC

Es sind im Grunde zwei Abfragen die ich durch ein Union verbunden habe und auf das Ergebnis das ich erhalte, würde ich gerne eine Gruppierung anwenden. Jede Abfrage einzeln funktioniert richtig, beide Abfragen zusammen auch (SELECT * FROM tmp). Das Problem tritt erst dann auf, wenn ich die GROUP BY-Klausel auf die temporäre Tabelle anwende.

Frage: Kann ich auf eine solche temporäre Tabelle kein GROUP BY anwenden?

Ich freue mich über alle hilfreichen Antworten und wünsche euch allen ein frohes Fest :wink:

Gruß,
Kez

Hallo,
ich habe ein Problem mit einer MySQL-Abfrage. Es geht um eine
Datenbank mit „Kampfberichten“ aus einem Browsergame zu der
ich ein paar Statistiken erstellen möchte.

Dazu möchte ich folgene Abfrage durchführen:

gelöscht :

Es sind im Grunde zwei Abfragen die ich durch ein Union
verbunden habe und auf das Ergebnis das ich erhalte, würde ich
gerne eine Gruppierung anwenden. Jede Abfrage einzeln
funktioniert richtig, beide Abfragen zusammen auch (SELECT *
FROM tmp). Das Problem tritt erst dann auf, wenn ich die GROUP
BY-Klausel auf die temporäre Tabelle anwende.

Frage: Kann ich auf eine solche temporäre Tabelle kein GROUP
BY anwenden?

Ich freue mich über alle hilfreichen Antworten und wünsche
euch allen ein frohes Fest :wink:

Gruß,
Kez

Hallo Kez,

ebenfalls ein Frohes Fest!
Dein Code ist ohen die PRE-Tags schwer zu lesen!

SELECT \* 
 FROM (SELECT `zielinhaber_allianz` AS opfer,
 SUM(verteidiger\_boni\_verlust\_mp ) AS `mp_verlust_summe` ,
 count( pilot\_name ) AS anz, 
 sum( verteidiger\_boni\_verlust\_mp ) / count( pilot\_name ) AS durchschnitt
 FROM `kb_liste`
 WHERE `pilot_allianz` LIKE 'xXx'
 AND `angreifer_gewinnt` =1
 GROUP BY opfer
 UNION
 SELECT `pilot_allianz` AS opfer, 
 SUM( angreifer\_verlust\_mp ) AS `mp_verlust_summe` ,
 count( pilot\_name ) AS anz, 
 sum(angreifer\_verlust\_mp ) / count( pilot\_name ) AS durchschnitt
 FROM `kb_liste`
 WHERE `zielinhaber_allianz` LIKE 'xXx'
 AND `angreifer_gewinnt` =0
 GROUP BY opfer 
 ) as tmp
 GROUP BY opfer
 ORDER BY mp\_verlust\_summe DESC

Warum möchtest Du denn noch ein zweites Group by an der temporären Abfrage anbringen? Gibt es identische Einträge in zielinhaber_allianz und pilot_allianz? Was soll dann geschehen? Bitte beachte bei der Antwort, dass Du auch einen Durchschnittswert in der Abfrage hast.

SELECT opfer, 
 SUM( mp\_verlust\_summe ) AS `mp_verlust_summe` ,
 sum( anz ) AS anz, 
 sum( mp\_verlust\_summe ) / sum( anz ) AS durchschnitt 
 FROM (SELECT `zielinhaber_allianz` AS opfer,
 SUM(verteidiger\_boni\_verlust\_mp ) AS `mp_verlust_summe` ,
 count( pilot\_name ) AS anz
 FROM `kb_liste`
 WHERE `pilot_allianz` LIKE 'xXx'
 AND `angreifer_gewinnt` =1
 GROUP BY opfer
 UNION
 SELECT `pilot_allianz` AS opfer, 
 SUM( angreifer\_verlust\_mp ) AS `mp_verlust_summe` ,
 count( pilot\_name ) AS anz, 
 FROM `kb_liste`
 WHERE `zielinhaber_allianz` LIKE 'xXx'
 AND `angreifer_gewinnt` =0
 GROUP BY opfer 
 ) as tmp
 GROUP BY opfer
 ORDER BY mp\_verlust\_summe DESC

Mangels MySQL auf meinen Laptop nicht getestet!

MfG Georg V.

P.S.: Ohne Wildcard-Zeichen macht like übrigens keinen Sinn

`zielinhaber_allianz` LIKE 'xXx'

Hallo Kez,

ebenfalls ein Frohes Fest!
Dein Code ist ohen die PRE-Tags schwer zu lesen!

Sorry, ich habe die Tags schlicht vergessen.

SELECT *
FROM (SELECT zielinhaber_allianz AS opfer,
SUM(verteidiger_boni_verlust_mp ) AS
mp_verlust_summe ,
count( pilot_name ) AS anz,
sum( verteidiger_boni_verlust_mp ) / count(
pilot_name ) AS durchschnitt
FROM kb_liste
WHERE pilot_allianz LIKE ‚xXx‘
AND angreifer_gewinnt =1
GROUP BY opfer
UNION
SELECT pilot_allianz AS opfer,
SUM( angreifer_verlust_mp ) AS
mp_verlust_summe ,
count( pilot_name ) AS anz,
sum(angreifer_verlust_mp ) / count( pilot_name
) AS durchschnitt
FROM kb_liste
WHERE zielinhaber_allianz LIKE ‚xXx‘
AND angreifer_gewinnt =0
GROUP BY opfer
) as tmp
GROUP BY opfer
ORDER BY mp_verlust_summe DESC

Warum möchtest Du denn noch ein zweites Group by an der
temporären Abfrage anbringen? Gibt es identische Einträge in
zielinhaber_allianz und pilot_allianz? Was soll dann
geschehen? Bitte beachte bei der Antwort, dass Du auch einen
Durchschnittswert in der Abfrage hast.

In den Spalten ‚zielinhaber_allianz‘ und ‚pilot_allianz‘ stehen generell diegleichen Daten, jeder der angreift kann auch angegriffen werden.

Die erste Abfrage gibt mir die erfolgreichen Angriffe der Allianz xXx (die Angriffe bei denen der Spieler von xXx weniger Verluste hatte als der Gegner), die zweite Abfrage die erfolgreichen Verteidigungsaktionen.
Bei dem Gruppieren bekomme ich aber zwei Ergebnisse, er gruppiert nur jeweils die Angriffe und die Verteidigungsaktionen, die will ich mit dem letzten GROUP BY zu einem Ergebnis zusammenziehen, aber das klappt nicht. Er unterschlägt einfach die Ergebnisse der zweiten Abfrage.

Daraus möchte ich dann eine Tabelle erstellen mit den Spalten Opfer/gegnerische Ally ,
zerstörte mp,
Anzahl der Angriffe/Verteidigungsaktionen ,
Durchschnitt der zerstörten Militärpunkte.

Mangels MySQL auf meinen Laptop nicht getestet!

MfG Georg V.

P.S.: Ohne Wildcard-Zeichen macht like übrigens keinen Sinn

zielinhaber_allianz LIKE ‚xXx‘

Richtig, da hätte ich auch ein Gleichheitszeichen nehmen können, aber das erfüllt auch seinen Zweck :wink:

Ich hoffe die Informationen helfen weiter.

Gruß,
Kez

Hallo Kez,

ich habe mir mal Deine Query genauer angesehen: Auch nach Korrektur von weitere Datentyp-Fehlern konnte ich Deine Fassung nicht zum Laufen bringen. Meine Formulierung (bis auf ein überflüssiges Komma) läuft einwandfrei. Details kommen per PM.

MfG Georg V.

Meine Fassung muß auch nicht laufen, solange ich eine Fassung habe die überhaupt läuft! :wink:

Vielen Dank Georg, damit ist mein Problem gelöst und das Thema hier kann geschloßen werden.

Gruß,
Clint

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]