Luki: MySQL Query mit 2 Where Bedingungen

Hallo,

ich versuche schon die ganze Zeit ein bestimmtes SELECT zu bekommen und zwar geht es darum, dass ich alle MemberIDs ausgeben möchte, die eine GameID in der Tabelle TableGame UND in der Tabelle SlotGame haben.

$query = 'SELECT mID FROM Game WHERE (gID IN (SELECT gID FROM TableGame)) OR (gID IN (SELECT gID FROM SlotGame))  
GROUP BY mID HAVING COUNT (DISTINCT gID)=2';

Allerdings bekomme ich folgenden Fehler:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT gID)=2' at line 2"

Könnt ihr mir sagen, was an der Syntax nicht stimmt oder mir einen Tipp geben, wie ich näher an mein gewünschtes Ziel komme?

Danke schön und Grüße.

  1. Hello,

    ich versuche schon die ganze Zeit ein bestimmtes SELECT zu bekommen und zwar geht es darum, dass ich alle MemberIDs ausgeben möchte, die eine GameID in der Tabelle TableGame UND in der Tabelle SlotGame haben.

    *Bahnhof*

    Es wäre hilfreich, wenn Du uns die Tabellen (die relevanten Spalten) mal nebeneinander zeigen könntest und dann nochmal genau sagst, welche Werte Du am Anfang hast (ich vermute: keine) und welche Spaltenwerte übereinstimmen sollen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. Hallo Tom,

      danke für deine Antwort. Ich zeige dir mal einfachhaltshalber die Tabellen inklusive der Attribute.

      CREATE TABLE Member (  
      	mID CHAR(10) PRIMARY KEY,  
      	mName VARCHAR(64),  
      	joinYear YEAR  
      );  
        
      CREATE TABLE Game (  
      	gID CHAR(12) PRIMARY KEY,  
      	bet INT,  
      	winloss ENUM('win','loss'),  
      	mID CHAR(10),  
      	FOREIGN KEY (mID) REFERENCES Member (mID)  
      );  
        
      CREATE TABLE TableGame (  
      	gID CHAR(12) PRIMARY KEY,  
      	minbet INT,  
      	maxbet INT,  
      	FOREIGN KEY (gID) REFERENCES Game (gID)  
      );  
      CREATE TABLE SlotGame (  
      	gID CHAR(12) PRIMARY KEY,  
      	jackpot DECIMAL(10,2),  
      	sID CHAR(5),  
      	FOREIGN KEY (gID) REFERENCES Game (gID),  
      	FOREIGN KEY (sID) REFERENCES Slot (sID)  
      );  
      
      

      Was ich nun herausfinden möchte ist, welche MemberIDs in TableGame UND in SlotGame gespielt haben. Mein Problem ist, dass ich nicht weiß, wie ich prüfen soll, ob die Game gID in TableGame UND in SlotGame ist.

      Danke dir und liebe Grüße

      1. Hello Luki,

        BTW: IDs ohne besondere Not als Char-Typ anzulegen, ist unglücklich. Besser sind einfache ordinale Typen, wie Int oder Bigint oder wie das DBMS die auch immer nennt.

        Sieht mir noch etwas verknotet aus. So richtig kann ich die Relationen noch nicht nachvollziehen.

        Irgendwie erkenn ich nicht, in welchen Spalten in den Tabellen TableGame und SlotGame die mID wieder auftaucht.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Hello Luki,

          BTW: IDs ohne besondere Not als Char-Typ anzulegen, ist unglücklich. Besser sind einfache ordinale Typen, wie Int oder Bigint oder wie das DBMS die auch immer nennt.

          Sieht mir noch etwas verknotet aus. So richtig kann ich die Relationen noch nicht nachvollziehen.

          Irgendwie erkenn ich nicht, in welchen Spalten in den Tabellen TableGame und SlotGame die mID wieder auftaucht.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          Die mID kommt auch nicht in den Tabellen vor. Das wird doch über die Tabelle game geregelt, wer welches Spiel gespielt hat oder was meinst du? Die Tabellen tablegame und slotgame haben als foreign key den von gID.game.

          Liebe Grüße

      2. Hello,

        CREATE TABLE Game (
        gID CHAR(12) PRIMARY KEY,
        bet INT,
        winloss ENUM('win','loss'),
        mID CHAR(10),
        FOREIGN KEY (mID) REFERENCES Member (mID)
        );

        CREATE TABLE TableGame (
        gID CHAR(12) PRIMARY KEY,
        minbet INT,
        maxbet INT,
        FOREIGN KEY (gID) REFERENCES Game (gID)
        );
        CREATE TABLE SlotGame (
        gID CHAR(12) PRIMARY KEY,
        jackpot DECIMAL(10,2),
        sID CHAR(5),
        FOREIGN KEY (gID) REFERENCES Game (gID),
        FOREIGN KEY (sID) REFERENCES Slot (sID)
        );
        [/code]

        Was ich nun herausfinden möchte ist, welche MemberIDs in TableGame UND in SlotGame gespielt haben. Mein Problem ist, dass ich nicht weiß, wie ich prüfen soll, ob die Game gID in TableGame UND in SlotGame ist.

        Ich habe Dich so verstanden:

        select Game.mID,
        from Game, TableGame, Slotgame
        where Game.gID = TableGame.gID
            or Game.gID = SlotGame.gID;

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Was ich nun herausfinden möchte ist, welche MemberIDs in TableGame UND in SlotGame gespielt haben. Mein Problem ist, dass ich nicht weiß, wie ich prüfen soll, ob die Game gID in TableGame UND in SlotGame ist.

          Ich habe Dich so verstanden:

          select Game.mID,
          from Game, TableGame, Slotgame
          where Game.gID = TableGame.gID
              or Game.gID = SlotGame.gID;

          Ingrid mal wieder...

          select Game.mID,
          from Game, TableGame, Slotgame
          where Game.gID = TableGame.gID
              and Game.gID = SlotGame.gID;

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
          1. Ingrid mal wieder...

            select Game.mID,
            from Game, TableGame, Slotgame
            where Game.gID = TableGame.gID
                and Game.gID = SlotGame.gID;

            Moment... wer ist Ingrid?
            Das Statement liefert mir ein leeres Resultat, weil Game.gID nicht gleichzeitig gleich TableGame.gID und SlotGame.gID sein kann.
            Andere Vorschläge?

            1. Hallo,

              Moment... wer ist Ingrid?

              die findest du hier

              Gruß
              Kalk

            2. Hello,

              select Game.mID,
              from Game, TableGame, Slotgame
              where Game.gID = TableGame.gID
                  and Game.gID = SlotGame.gID;

              Das Statement liefert mir ein leeres Resultat, weil Game.gID nicht gleichzeitig gleich TableGame.gID und SlotGame.gID sein kann.

              Du solltest uns mal die wichtigsten Geschäftsregeln mitteilen. Dann können wir nachvollziehen, was passieren SOLL. Vielleicht ist das DB-Design ja gar nicht passend für die Aufgabenstellung.
              Auch Lehrer machen Fehler.

              Das wäre ein Beispiel dafür, wie man das verbal beschreiben könnte.

              T_Members -> Stammdaten.
                  Es werden gelegentlich neue Mitglieder aufgenommen.
                  Insert hat keinen direkten Einfluss auf die anderen Tabellen

              T_Game    -> Bewegungsdaten, Kopfdaten für T_TableGame und T_Slotgame.
                  Neue Spielrunden werden hier eingetragen
                  die Positionsdaten zum Spiel findet man dann in T_TableGame UND (?) in T_SlotGame

              T_TableGame -> Bewegungsdaten, Positionsdaten zu T_Game
              T_SlotGame ->  Bewegungsdaten, Positionsdaten zu T_Game

              Alternativ könntest Du uns auch eine grafische Darstellung der Zusammenhänge liefern
              siehe https://de.wikipedia.org/wiki/Entity-Relationship-Modell

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bikers-lodge.com
      3. hi,

        Oracle?

        Was ich nun herausfinden möchte ist, welche MemberIDs in TableGame UND in SlotGame gespielt haben. Mein Problem ist, dass ich nicht weiß, wie ich prüfen soll, ob die Game gID in TableGame UND in SlotGame ist.

        Join die drei Tabellen Game*SlotGame*TableGame über gID. Nimm aus Game die mID mit und joine das mit Member on Member.mID = Game.mID

        Hotti

        1. Hi Hotti,

          Join die drei Tabellen Game*SlotGame*TableGame über gID. Nimm aus Game die mID mit und joine das mit Member on Member.mID = Game.mID

          Das habe ich schon versucht, allerdings bekomme ich ein leeres Result zurück oder mache ich etwas falsch?

          $query = 'SELECT m.mID FROM Member m INNER JOIN Game g ON g.mID = m.mID INNER JOIN TableGame tg ON tg.gID = g.gID INNER JOIN  
          SlotGame sg ON g.gID = sg.gID';
          

          Liebe Grüße
          Luki

          1. Mon,

            Das habe ich schon versucht, allerdings bekomme ich ein leeres Result zurück oder mache ich etwas falsch?

            Beschreib mal bitte Deine Gedanken zum DB-Design (in Worten).

            Horst

            1. Beschreib mal bitte Deine Gedanken zum DB-Design (in Worten).

              Im Prinzip ist es eine Hausaufgabe, also nicht nicht ich habe es mir ausgedacht, wo man bestimmte select Statements herausfinden muss. Aber es geht darum, dass es eine Art Casino ist und die Member TableGames und Slotgames spielen können. Diese Spiele werden in der Game Tabelle zusammengefasst.

              1. Moin,

                Beschreib mal bitte Deine Gedanken zum DB-Design (in Worten).

                Im Prinzip ist es eine Hausaufgabe, also nicht nicht ich habe es mir ausgedacht, wo man bestimmte select Statements herausfinden muss. Aber es geht darum, dass es eine Art Casino ist und die Member TableGames und Slotgames spielen können. Diese Spiele werden in der Game Tabelle zusammengefasst.

                Wenn Deine Abfrage was Sinnvolles liefern soll, dann ist das Verständnis fürs Design schon wichtig und offengestanden, anhand der Create-Statements verstehe ich auch nicht so recht, was sich der Designer dabei gedacht hat, das geht schon mit der Frage los "TableGames und Slotgames" ODER "TableGames oder Slotgames" ;)

                Horst