Gibt es etwas ähnliches wie if für SQL/MySQL?

Hades85

Benutzer
Beiträge
8
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


Hallo zusammen, ich hoffe einer von euch kann mir weiterhelfen. Ich habe etliche solcher Datensätze die in etwa so aussehen wie die oben hier. Es handelt sich um ein Team Spiel. In dem Fall 2VS2.

Ich will eine Abfrage erstellen die mir nur die Spieler anzeigt die innerhalb einer Match ID gewonnen haben OHNE Where "Match_ID"=1. Ich möchte herausfinden welche Spieler am besten miteinander spielen können.


SELECT * FROM "Match" WHERE "Name" IN ('Spieler1','Spieler2') AND "Gewonnen"=true;

Diese Abfrage zeigt mir logischerweise alle Spieler an die gewonnen haben, unabhängig ob sie zusammen gespielt haben. Ich bräuchte aber eine abfrage die "zeige mir alle datensätze an von den gesuchten Spielern die gewonnen haben und die selbe Match ID haben" das will ich aber zählen mit count. Sobald ich dann where Match_ID=1 müsste ich das in PHP programmieren in einer for schleife damit er alle Match ID durchgeht und die dann zählen.
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
hi,

sollte so gehen, wobei es bei deiner abfrage egal ist ob einer oder beide gespielt haben
Code:
SELECT *
FROM "Match"
WHERE "Name" IN ('Spieler1','Spieler2') AND "Gewonnen"=true
GROUP BY  Match_ID;

und zum zählen

Code:
SELECT count(*)
FROM "Match"
WHERE "Name" IN ('Spieler1','Spieler2') AND "Gewonnen"=true
GROUP BY  Match_ID;

Gruss

Bernd
 
Das will ich aber vermeiden ob einer oder zwei gespielt haben. Ich will unbedingt wissen in welcher Match ID die zwei gesuchten Spieler zusammen gewonnen haben.

Sagen wir zB Spieler1 und Spieler3 haben in Match 5 zusammen gespielt und gewonnen aber dann in Match 6 gegeneinander gespielt und nur einer hat gewonnen, dann will ich aber nur Match 5 angezeigt bekommen, weil nur dann die beiden zusammen gewonnen haben.

Ich hoffe du verstehst mich
 
Du hast also etwa sowas:

Code:
test=*# \d hades85
  Table "public.hades85"
  Column  |  Type  | Modifiers
----------+---------+-----------
 spieler  | text  |
 gewonnen | boolean |
 match_id | integer |

test=*# select * from hades85 ;
 spieler  | gewonnen | match_id
----------+----------+----------
 spieler1 | f  |  1
 spieler2 | t  |  1
 spieler3 | f  |  1
 spieler4 | t  |  1
 spieler1 | t  |  5
 spieler2 | f  |  5
 spieler3 | t  |  5
 spieler4 | f  |  5
 spieler1 | t  |  6
 spieler2 | t  |  6
 spieler3 | f  |  6
 spieler4 | f  |  6
(12 rows)

Das sind je match_id die Sieger:

Code:
test=*# select array_agg(spieler), match_id from hades85 where gewonnen group by match_id;  array_agg  | match_id
---------------------+----------
 {spieler2,spieler4} |  1
 {spieler1,spieler2} |  6
 {spieler1,spieler3} |  5
(3 rows)

Du willst wissen, ob Spieler1 und 3 zusammen gewonnen haben?

Code:
test=*# select * from (select array_agg(spieler) as sieger, match_id from hades85 where gewonnen group by match_id) foo where sieger @> array['spieler3','spieler1'];
  sieger  | match_id
---------------------+----------
 {spieler1,spieler3} |  5
(1 row)


Achtung: das wird so wohl nicht in MySQL gehen, das kennt meines Wissens nach keine Arrays. Da wirst eine Alternative frickeln müssen. Oder DB wechseln.

Hinweis: Deine Tabelle scheint nicht korrekt normalisiert zu sein.

Frage: was ich bei Dir nicht verstehe: "Spieler1 und Spieler3 haben in Match 5 zusammen gespielt und gewonnen aber dann in Match 6 gegeneinander gespielt". Wie wird in Deiner Tabelle unterschieden, ob man innerhalb eines Spieles miteinander oder gegeneinander spielt? Das ist massiv unklar.
 
Nehmen wir mal deine Daten als Vorlage:
Code:
spieler1 | f  |  1
spieler2 | t  |  1
spieler3 | f  |  1
spieler4 | t  |  1
Im Spiel 1 haben Spieler 1 und Spieler 3 zusammen gegen Spieler 2 und Spieler 4 gespielt. Spieler 1 und 3 haben verloren.
Ich wüsste nicht was daran nicht eindeutig ist?
 
Sorry, dass ich mich vielleicht nicht eindeutig ausgedrückt habe. Also die Spieleranzahl variert zwischen 4-8 Spielern pro Match. Es gibt IMMER NUR zwei Teams. Unterschieden wird anhand des Sieges oder der Niederlage. Ich könnte noch eine Team ID Spalte einfügen, Team 1 und Team 2 aber das wollte ich mir sparen, weil man das auch anhand des Boolschen Wertes Gewonnen feststellen kann, true oder false. Also alle die gewonnen haben, waren in einem Team und die Verlierer auch.
Die Match ID ist nicht der Unique Key.

Also nochmal etwas besser:

ID = Integer , Spieler = String/Char , Gewonnen = Boolean , Match ID = Integer




EDIT: Ich hatte jetzt überlegt in einer extra Tabelle noch hinzuzufügen, die jeweiligen ID der Gewinner in eine Spalte "Team Gewinner" per Kommata zu trennen und dort als String/Text zu schreiben. Also sollten in Match 1 Spieler 1 und Spieler 4 gewonnen haben, dann in Spalte "Team Gewinner" der Text "1,4" und im Gegenzug die Verlierer in eine Spalte Team Verlierer , "2,3"
Nur würdet ihr mir das empfehlen?
 
Es gibt nicht zufällig eine Mathematische Formel die mir aus zwei Zahl eine einzigartige Summe/Produkt erstellt?

Habt ihr vielleicht noch eine Idee? Oder komme ich nicht drum herum das in PHP zu programmieren?
 
Ist ein Hash eindeutig? Also wenn ich die Zahl 2+4 addiere , das Ergebnis sich unterscheidet von 5+1 oder 3+3? Ich habe gelesen Hash werden auch zur Indizierung in DB benutzt, wäre das hier ein sinnvoller Einsatz?
 
Werbung:
Warum probierst Du es nicht?

Code:
test=# select md5(2::text || 4::text) = md5(5::text || 1::text);
 ?column?
----------
 f
(1 row)
 
Zurück
Oben