MySQL Zusammenfassen von Records in ein Record(Merge)

DefconDev

Bekanntes Mitglied
Java:
Name            Volk      Gewonnen     Match_ID

Spieler 1        Volk 1    Nein            1

Spieler 2        Volk 2    Ja               1  

Spieler 3        Volk 3    Nein            1

Spieler 4        Volk 4    Ja               1

Ich möchte diese 4 Records zu einem record zusammenfassen ohne das sie sich gegenseitig überschreiben.

Und im selben query direkt abfragen ob zB. Spieler 1 und Spieler 2 gewonnen haben.


Ich hoffe ich habe nichts zu umständlich beschrieben


Danke im Voraus.
 
Zuletzt bearbeitet:

Tom299

Bekanntes Mitglied
Du könntest eine Spalte "Gewinner" machen, wo du die Spieler reinschreibst bzw. deren IDs, falls es eine eigene Spielertabelle gibt.

Gewinner
Spieler 1, Spieler 2

Aber evtl. brauchst du dann auch eine Verlierer-Spalte
 

DefconDev

Bekanntes Mitglied
Es gibt eine eigene Spieler Tabelle.

Auch gibt es eine Tabelle "Match" die anhand der obigen Match ID weitere Informationen bereithält.

Die Frage ist nur, wie sinnvoll wäre es, eine Spalte mit den Gewinnern/Verlieren zu erstellen. Welchen Datentyp benutze ich da?

Ich hatte mir das mal überlegt aber dann verworfen weil ein String(char) eigentlich eher ungeeignet ist. Gesetz dem Fall ich schreibe dort die ID's alle rein die gewonnen haben, sähe die Spalte so aus Gewinner 2,4 und Verlierer 1,3.

Dann müsste ich aber in PHP immer mit einer String abfrage erstellen und manuell die String-Kombinationen eingeben "2,4" um herauszufinden wer mit wem mal gewonnen hat.

Als int kann ich die auch nicht spezifizieren, denn das sähe so aus 24, und wenn ich einen Spieler mit ID 24 habe wäre das ein doppelter Eintrag und nicht mehr Unique.

Dann hatte ich überlegt mehrer Spalten zu erstellen, da ist aber das Problem die Spieleranzahl variert in der Regel zwischen 4-8. Das heißt ich müsste pro Zeile 8 weitere Spalten erstellen nur um festzuhalten in jeder spalte welcher Spieler gewonnen hat und wer nicht und manchmal bleibt eine Spalte dann leer weil zb. 6 Leute gespielt haben. Die Idee fand ich bisher noch nicht so prickelnd
 

Joose

Top Contributor
Ich hatte mir das mal überlegt aber dann verworfen weil ein String(char) eigentlich eher ungeeignet ist. Gesetz dem Fall ich schreibe dort die ID's alle rein die gewonnen haben, sähe die Spalte so aus Gewinner 2,4 und Verlierer 1,3.
Dann müsste ich aber in PHP immer mit einer String abfrage erstellen und manuell die String-Kombinationen eingeben "2,4" um herauszufinden wer mit wem mal gewonnen hat.
Als int kann ich die auch nicht spezifizieren, denn das sähe so aus 24, und wenn ich einen Spieler mit ID 24 habe wäre das ein doppelter Eintrag und nicht mehr Unique.

Eine Speicherung auf diese Art und Weise "verstößt" auch gegen die 1.Normalform bei relationalen Datenbanken!
(Normalisierung)

Dann hatte ich überlegt mehrer Spalten zu erstellen, da ist aber das Problem die Spieleranzahl variert in der Regel zwischen 4-8. Das heißt ich müsste pro Zeile 8 weitere Spalten erstellen nur um festzuhalten in jeder spalte welcher Spieler gewonnen hat und wer nicht und manchmal bleibt eine Spalte dann leer weil zb. 6 Leute gespielt haben. Die Idee fand ich bisher noch nicht so prickelnd

Ist zwar eine Möglichkeit aber solltest du mal die Azahl an möglichen Spielern erhöhen musst du entsprechend viele Spalten hinzufügen. Daher würde ich davon abraten.


Daher rate ich dir die Daten so zu lassen wie sie oben stehen ;) (Einzig für die Spalte gewonnen würde ich eine boolschen Datentyp nehmen (bei MySQL sollte das BIT sein)
Da verstößt nichts gegen die Normalformen und du kannst auch das erreichen was du willst, man muss nur den richtigen Select finden.

SELECT * FROM Gewinner WHERE MatchID = ? AND Gewonnen = 'Ja';

Dein Programm sollte die Daten dann so aufbereiten wie du sie angezeigt bekommen willst! Nicht die Datenbank, dazu ist sie nicht gedacht!
 

Tom299

Bekanntes Mitglied
Vielleicht fehlt dir noch eine "Teamtabelle" oder so, weil so wie es aussieht, gibt es bei 4 Spielern ja 2 Gewinner und 2 Verlierer, das sieht nach Teamplay aus, oder ist das nicht so?
Ansonsten würde ich vielleicht noch eine Tabelle "Team" anlegen, die x Spieler enthält, und das Team gewinnt dann das Match und über die Team-Tabelle kommst du an die einzelnen Spieler dann ran.
 

DefconDev

Bekanntes Mitglied
SELECT * FROM Gewinner WHERE MatchID = ? AND Gewonnen = 'Ja';

Dein Programm sollte die Daten dann so aufbereiten wie du sie angezeigt bekommen willst! Nicht die Datenbank, dazu ist sie nicht gedacht!

Danke dir für den Link und deine Erläuterung.

Ich hatte mich bisher gesträubt dass per PHP zu filtern, dachte mit MySQL ginge es komfortabler.
 

DefconDev

Bekanntes Mitglied
Vielleicht fehlt dir noch eine "Teamtabelle" oder so, weil so wie es aussieht, gibt es bei 4 Spielern ja 2 Gewinner und 2 Verlierer, das sieht nach Teamplay aus, oder ist das nicht so?
Ansonsten würde ich vielleicht noch eine Tabelle "Team" anlegen, die x Spieler enthält, und das Team gewinnt dann das Match und über die Team-Tabelle kommst du an die einzelnen Spieler dann ran.

Ja, es ist Teamplay.

Eine Tabelle extra für Team zu erstellen halte ich gerade nicht für sinnvoll.

Eine abfrage dieser wäre mehr als kompliziert.

Stellen wir uns vor ich erstelle eine Tabelle

Java:
ID      TEAM NR      Spieler_Name1      Spieler_Name2      Spieler_Name3      Spieler_Name4    gewonnen
1       1                Gustav                 Frido                   Loki                    Gandalf             true
2       2                Metin                   Josef                   Ömer                  Janosch            false

Jetzt stellt sich mir die Frage, wie erstelle ich eine Abfrage, die mir sagt welcher Spieler mit welchem Spieler zusammnen gewonnen hat.

Select * from Team where Spieler_Name[x]='Gustav' AND Spieler_Name[x]='Frido' AND gewonnen=true;

Das ist zwar möglich, aber diese Abfrage wäre nur mit einer verschachtelten Schleife möglich bei zwei Spielern oder denke ich zu kompliziert. Bei mehr als 2 Spielern wird es extrem umständlich.
 
Zuletzt bearbeitet:

Tom299

Bekanntes Mitglied
Die Team-Tabelle würde ich aber anders aufbauen, vielleicht so:

Team_ID Spieler_ID Volk_ID
1 1 1
1 3 2
2 2 3
2 4 4
3 5 1
3 1 3

Damit bist du nicht auf eine bestimme max. Teamgröße festgelegt.

Die Match-Tabelle sehe ich dann als eine Art-Mapping-Tabelle

Match_ID Team_ID Gewonnen
1 1 true
1 2 false
2 3 false
2 2 true

Wer hat Match 1 gewonnen?
"Select Spieler_ID from Team t, Match m
where m.Match_ID = 1
and m.Gewonnen = true
and m.Team_ID = t.TEAM_ID"

Habs jetzt nicht überprüft, da ich weder die Tabellen dazu habe noch viel Zeit sie anzulegen um zu testen, aber so in der Art würde es funktionieren. Lieber das SQL etwas komplizierter und die Datenbank einfach halten, wobei das SQL hier noch einfach ist. Man könnte es auch anders schreiben mit Join Tabelle on blabla. Viele Wege führen nach Rom :)
 

Ähnliche Java Themen


Oben