php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 20-10-2007, 17:31
okoman
 Member
Links : Onlinestatus : okoman ist offline
Registriert seit: May 2002
Ort: Leipzig
Beiträge: 166
okoman ist zur Zeit noch ein unbeschriebenes Blatt
okoman eine Nachricht über ICQ schicken
Standard [SQL allgemein] Zusammfassen zweier Spalten anhand einer ID

Hi!
Ich glaube die Überschrift kann das Problem nicht ganz ausdrücken, es lässt sich aber auch nicht so einfach umschreiben.

Jedenfalls hier erst einmal die Voraussetzungen: Ich bin dabei für ein Spiel ein Statistiksystem zu erstellen, wie es ja bei den meisten modernen MP-Spielen vorhanden ist. Deswegen habe ich folgende Tabelle:

kills
id, match_id, killer_id, killed_id, n

id dient der Identifizierung des Datensatzes
match_id ist eine Zahl, die anzeigt, in welcher Spielrunde die Kills stattgefunden haben.
killer_id steht für den Spieler, der einen anderen abgeschossen hat und killed_id steht für den Abgeschossenen.
n bezeichnet, wie oft in diesem Match killer_id den Mitspieler killed_id abgeschossen hat.

Soweit so gut. Nun kommt das, was ich gern als Abfrageergebnis hätte.
Als Vorgabe habe ich die match_id. Nun möchte ich in meinem Abfrageergebnis eine Auflistung haben, wie oft jeder Spieler getroffen hat und wie oft er abgeschossen wurde. Das wird dann noch mit einer Namenstabelle gejoint usw, aber das soll hier nicht interessieren.
Das Problem ist, dass ich mir nicht sicher bin, ob das Überhaupt mit einer SQL-Abfrage machbar ist. Zumindest bin ich selbst zu keiner Lösung gekommen. Es wäre kein Problem das ganze in ein paar mehr Abfragen hinzubekommen, aber man soll ja immer optimieren und es interessiert mich einfach, ob so etwas möglich ist

Hier mal ein Beispiel:
id, match_id, killer_id, killed_id, n
..., 1, A, B, 4
..., 1, B, A, 7
..., 1, C, A, 12

(A hat B 4x abgeschossen, B hat A 7x abgeschossen, C hat A 12x abgeschossen)

Ergebnis:
player_id, kills, deaths
A, 4, 19
B, 7, 4
C, 12, 0

Ich dachte eigentlich, ich wäre recht fit in SQL, aber irgendwie ist mir die Sache zu hoch Man kann ja mit GROUP BY arbeiten, um z.B. alle Kills/Deaths eines Spielers abzufragen, aber halt immer nur entweder oder. Eine Lösung, wie ich beides in eine Tabelle bekomme, habe ich noch nicht gefunden.

Schonmal danke, wer sich die Zeit nimmt und sich mein Problem mal durchliest

Geändert von okoman (20-10-2007 um 17:33 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 20-10-2007, 18:02
okoman
 Member
Links : Onlinestatus : okoman ist offline
Registriert seit: May 2002
Ort: Leipzig
Beiträge: 166
okoman ist zur Zeit noch ein unbeschriebenes Blatt
okoman eine Nachricht über ICQ schicken
Standard

Okay, irgendwie komm ich immer nachdem ich eine Frage poste auf die Antwort. Rückblickend ist es eigentlich gar nicht so kompliziert. Das mit den zwei GROUP BY Möglichkeiten ist mir während dem Schreiben eingefallen und dann war es nicht mehr allzu viel Denkarbeit, diese beiden halt einfach anhand der ID zusammenzufassen.

Deswegen hier das funktionierende Statement:
Code:
SELECT `kills`.`id` as `id`, `kills`.`n` as `kills`, `deaths`.`n` as `deaths` 
FROM 
   (SELECT `killer_id` as `id`, SUM(`n`) as `n` 
    FROM `kills` GROUP BY `killer_id`) as `kills`
LEFT OUTER JOIN 
   (SELECT `killed_id` as `id`, SUM(`n`) as `n` 
    FROM `kills` GROUP BY `killed_id`) as `deaths`
ON `kills`.`id` = `deaths`.`id`
GROUP BY `kills`.`id`
Sorry, dass ich hier unnötiger Weise einen Thread geöffnet habe

Geändert von okoman (20-10-2007 um 18:05 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 20-10-2007, 18:06
highrise
 Member
Links : Onlinestatus : highrise ist offline
Registriert seit: Apr 2006
Ort: zu Hause *g*
Beiträge: 257
highrise ist zur Zeit noch ein unbeschriebenes Blatt
Standard

SELECT pid AS player_id, SUM( k ) AS kills, SUM( d ) AS deaths
FROM (

(
SELECT killer_id AS pid, SUM( n ) AS k, 0 AS d
FROM spiele
GROUP BY killer_id
)

UNION

(
SELECT killed_id AS pid, 0 AS k, SUM( n ) AS d
FROM spiele
GROUP BY killed_id
)

) AS ergebnisse
GROUP BY player_id


greetz, high


//edit: und da war ich definitiv mal wieder zu langsam... ;-)
Würde mich mal interessieren, welche query schneller ist...
__________________
Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
When everything else fails, manipulate the data...
Beschriftungen / Großformatdruck / Werbemittel
Mit Zitat antworten
  #4 (permalink)  
Alt 20-10-2007, 18:21
okoman
 Member
Links : Onlinestatus : okoman ist offline
Registriert seit: May 2002
Ort: Leipzig
Beiträge: 166
okoman ist zur Zeit noch ein unbeschriebenes Blatt
okoman eine Nachricht über ICQ schicken
Standard

Danke, denn meins hat nicht ganz einwandfrei funktioniert. Spieler mit 0 Kills wurden nicht zurückgegeben, durch das LEFT JOIN.
Man bräuchte ja bei meiner Variante eine Mischung aus LEFT JOIN und RIGHT JOIN. Soweit ich weiß, wäre das ja ein FULL OUTER JOIN, den MySQL aber (anscheinend?) nicht untnerstützt. Wie würde man das in MySQL hinkriegen?

PS: Wenn die Tabelle demnächst ordentlich gefüllt ist, kann ich ja durchaus mal testen, wie schnell die Queries sind.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:44 Uhr.