Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Hades85, 25 Juni 2015.

  1. Hades85

    Hades85 Benutzer

    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 von einem Moderator bearbeitet: 26 Juni 2015
  2. BerndB

    BerndB Datenbank-Guru

    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
     
    Hades85 gefällt das.
  3. Hades85

    Hades85 Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
    Hades85 gefällt das.
  5. Distrilec

    Distrilec Datenbank-Guru

    @akretschmer... Es gibt für jedes Spiel zwei Verlierer und zwei Gewinner... Und jetzt rate mal wer da zusammen gespielt hat ;)
     
    Hades85 gefällt das.
  6. akretschmer

    akretschmer Datenbank-Guru

    Eben. Das ist nicht eindeutig. In match_id, gegen wen hat Spieler2 gespielt?
     
    Hades85 gefällt das.
  7. Distrilec

    Distrilec Datenbank-Guru

    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?
     
    Hades85 gefällt das.
  8. akretschmer

    akretschmer Datenbank-Guru

    ach so, es sind immer 2 gegen 2, ja, dann ist es okay.
     
    Hades85 gefällt das.
  9. Hades85

    Hades85 Benutzer

    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?
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Nein.
     
    Hades85 gefällt das.
  11. Distrilec

    Distrilec Datenbank-Guru

    Da kann ich @akretschmer nur zustimmen...

    Wobei mir so direkt auch kein "optimales" Modell einfällt...
     
    Hades85 gefällt das.
  12. Hades85

    Hades85 Benutzer

    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?
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Was willst Du machen? Eine Hash bilden?
     
    Hades85 gefällt das.
  14. Hades85

    Hades85 Benutzer

    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?
     
  15. akretschmer

    akretschmer Datenbank-Guru

    Warum probierst Du es nicht?

    Code:
    test=# select md5(2::text || 4::text) = md5(5::text || 1::text);
     ?column?
    ----------
     f
    (1 row)
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden