SQL-Abfragen in meiner HM Datenbank?

    • ChrisA3
      ChrisA3
      Bronze
      Dabei seit: 25.08.2005 Beiträge: 6.481
      Ich würde gerne meine HM PostgreSQL Datenbank nutzen und spezifische Dinge abfragen. Zum Beispiel würden mich interessieren eine Abfrage der Art "In all meinen SNGs finde alle Hände in denen von Spieler xyz ein All-in gecallt wird und Stacksizes so und so sind".

      Ich weiß aus Informatik in der Schule noch dass sowas irgendwie funktionieren müsste, weiß jemand wie es geht? Wenn ja wo müsste ich so einen Befehl eingeben und wie muss er strukturiert sein? Für alle Hilfe wäre ich sehr dankbar, auch wenn es nur Teile sind.
  • 20 Antworten
    • rawman81
      rawman81
      Bronze
      Dabei seit: 27.10.2008 Beiträge: 7.787
      Das geht mit Sicherheit, dazu müsste man aber erstmal analyisieren, welche Tabellen man braucht, welche Fremdschlüssel zu welchen Primärschüsseln gehören, welche Werte wo zu finden sind und und und....

      Hab grad mal im pgAdmin nachgeschaut, HM benutzt 51 Tabellen. Ich denke das ist mit ein bisschen Arbeit verbunden, da erstmal alle Daten zusammenzusuchen, die man für ein SQL-Query brauchen würde.
    • toleit00
      toleit00
      Bronze
      Dabei seit: 27.01.2007 Beiträge: 2.451
      hi bin grad auch dabei mit java auf die datenbank zuzugreifen.

      hab mir mal das Modell angeschaut und festgestellt das es relativ komplex ist

      ich hab mir das modell mit pgadmin III angeschaut und geschaut welche daten ich von welchen tabellen haben will.
      was mir aufgefallen ist, dass auch bei einfachen gewünschten informationen die sql abfragen recht komplex wurden (die informationen sind über 50 tabellen verteilt).
      ich denk aber mit ein wenig aufwand kannst da viel machen.

      wenn du direkt sql abfragen auf die datenbank absetzen willst (ohne verwendung einer entwicklungsumgebung) dann würd ich einfach die SQL Shell (psql) verwenden, die is glaub standard mässig dabei

      code:
      SELECT specialholecardactions_hero.holecardplayerhandscashkeycolumns_hero.netamountwon,gametypes.bigblind, playerhandscashkeycolumns_hero.netamountwon/gametypes.bigblind AS WON_BB 
      FROM specialholecardactions_hero 
      INNER JOIN playerhandscashkeycolumns_hero ON specialholecardactions_hero.pokerhand_id=playerhandscashkeycolumns_hero.pokerhand_id 
      INNER JOIN gametypes ON playerhandscashkeycolumns_hero.gametype_id=gametypes.gametype_id
      WHERE specialholecardactions_hero.player_id=298


      so sieht nun ne einfache abfrage aus die mir die holecards, das ergebnis in bb und als variante fixed limit ausgibt.

      mit FROM TabelleA INNER JOIN tabelleB ON SchlüsselA = SchlüselB kannst zwei Tabellen mit einander verbinden, weiß net wie fit du da bist.

      weiß nicht ob man das sauberer "programmieren" kann, aber is auf jeden fall net ohne, sich durch die ganzen tabellen zu arbeiten.
    • rawman81
      rawman81
      Bronze
      Dabei seit: 27.10.2008 Beiträge: 7.787
      Im pgAdmin kannste auch direkt Queries absetzen unter Werkzeuge->Abfragewerkzeug.

      Ach Ja:
      Original von ChrisA3
      Wenn ja wo müsste ich so einen Befehl eingeben und wie muss er strukturiert sein? Für alle Hilfe wäre ich sehr dankbar, auch wenn es nur Teile sind.
      Der Befehl sieht prinzipiell so aus:
      code:
      SELECT <Spalten> FROM <Tabellen> WHERE <Bedingungen>


      <Tabellen> = Hier kommen alle Tabellen rein, die du brauchst
      <Spalten> = Hiermit filterst du im Prinzip die Spalten aus der Ergebnisrelation, die du bekommst
      <Bedingungen> = Wie der Name schon sagt, z.b. playerid=xyz und was GANZ wichtig is, hier müssen auch Fremd- und Primärschlüssel gekoppelt werden (in der Form "PS=FS"), sonst bekommst du nen riesen Datenwulst.

      Eine genauere Beschreibung der Syntax findet sich aber auch zur genüge im Netz ;)
    • ChrisA3
      ChrisA3
      Bronze
      Dabei seit: 25.08.2005 Beiträge: 6.481
      Original von toleit00
      code:
      SELECT specialholecardactions_hero.holecardplayerhandscashkeycolumns_hero.netamountwon,gametypes.bigblind, playerhandscashkeycolumns_hero.netamountwon/gametypes.bigblind AS WON_BB 
      FROM specialholecardactions_hero 
      INNER JOIN playerhandscashkeycolumns_hero ON specialholecardactions_hero.pokerhand_id=playerhandscashkeycolumns_hero.pokerhand_id 
      INNER JOIN gametypes ON playerhandscashkeycolumns_hero.gametype_id=gametypes.gametype_id
      WHERE specialholecardactions_hero.player_id=298

      Ich hab sowas leider noch nie gemacht oder benutzt, hab mir jetzt aber pgAdmin mal angesehen und finde immerhin schon die ganzen Tabellen. Dieses SELECT FROM WHERE kenn ich noch aus einem Unikurs, da haben wir das aber nur in Theorie gemacht also nie am PC und immer mit 2-3 tables und 2-3 attributen.

      Hab jetzt grade eine Weile versucht deinen Code nachzuvollziehen und mit Pgadmin herumgespielt, mir ein bisschen Data anzeigen lassen usw. Ich habe aber noch ein paar Fragen.

      1) Du machst hier ja nichts anderes als nur aus playerhandscashkeycolumns und specialholecardactions rauszusuchen: wo ist die gametype_id gleich, wo ist die pokerhand_id gleich (um den Join sinnvoll zumachen und nicht unnütze Zeilen zu verbinden richtig?), alles unter der Bedingung von player_id = xyz.

      Das einzige was ich nicht 100% verstehe ist die Select-zeile. Ist dieser Ausdruck "specialholecardactions_hero.holecardplayerhandscashkeycolumns_hero" durch den Join eine neue Tabelle geworden aus der du jetzt netamountwon ausliest?

      Außerdem dieser Ausdruck hier: "playerhandscashkeycolumns_hero.netamountwon/gametypes.bigblind AS WON_BB"

      Machst du hier eine neue Tabelle oder Spalte names "WON_BB" auf in der du sowohl netamountwon als auch bigblind speicherst? Wenn ja bräuchte ich das für meine Zwecke garnicht.


      2) Fixed Limit findet man ja unter Gametypes.bigblinds.pokergame oder Gametypes.bigblinds.pokergametype (da ist es = 2). Das fragst du hier aber ja garnicht ab? Irgendwie seh ich nicht wo dein Query nach FL filtert.

      Aber danke fürs posten auf jeden Fall, das hilft schonmal sehr weiter. Jetzt muss ich nurnoch rausfinden wie ich Dinge wie "Call All-in PF" bspw rausfiltere, aber sollte irgendwie gehn.
    • toleit00
      toleit00
      Bronze
      Dabei seit: 27.01.2007 Beiträge: 2.451
      Ist dieser Ausdruck
      "specialholecardactions_hero.holecardplayerhandscashkeycolumns_hero" durch den Join eine neue Tabelle geworden aus der du jetzt netamountwon ausliest?
      Ich weiß nicht ob das so ausführlich notwendig is, aber da sich die Attribute in den unterschiedlichen Tabellen wiederholen und ich anfangs nicht sicher war welche Tabellen ich verwende werde, hab ich alle Attribute explizit angesprochen mit Tabellename.Attribut

      Neue Tabellen werden generell nicht erzeut, macht ja auch kein Sinn ein strukturiertes Datenbankmodell zu erstellen um danach redundante Daten zu erzeugen.

      Mit dem JOIN verbinde ich nur die Tabellen um z.b. aus der Tabelle player mit dem PK player_id den Spieler mit der id 5 zu suchen und aus der Tabelle holecards welche als FK player_id besitzt die zugehörigen Karten abzufragen. Kurz zusammengefasst ist das join nur um eine Abfrage über mehrere Tabellen absetzen zu können


      Außerdem dieser Ausdruck hier: "playerhandscashkeycolumns_hero.netamountwon/gametypes.bigblind AS WON_BB"

      Machst du hier eine neue Tabelle oder Spalte names "WON_BB" auf in der du sowohl netamountwon als auch bigblind speicherst?
      genau, es wird in der Abfrage eine neue Spalte mit dem Ergebnis der Division netamount/bigblind erzeugt.
      Hatte das auch nur als Beispiel mit drin gelassen.


      2) Fixed Limit findet man ja unter Gametypes.bigblinds.pokergame oder Gametypes.bigblinds.pokergametype (da ist es = 2). Das fragst du hier aber ja garnicht ab? Irgendwie seh ich nicht wo dein Query nach FL filtert.
      jo sorry, filtern tu ich erst später im quellcode und nicht in dem sql Statement

      edit: paar Rechtschreibfehler rauseditiert.
    • ChrisA3
      ChrisA3
      Bronze
      Dabei seit: 25.08.2005 Beiträge: 6.481
      Eine Frage hab ich noch: Wie mache ich denn einen Join über 2 Tabellen die keine gleichen Attribute haben? Also bspw tourneydata und playerhandstourneymisc würd ich gerne verknüpfen, die haben aber keinerlei Spalten gleich, sodass ich die ganzen SchlüsselA=SchlüsselB Sachen garnicht machen kann. Da brauch ich wahrscheinlich irgendwelche Schlüssel die in einer dritten Tabelle stehen oder? Wie seh ich denn die Struktur der Schlüssel und finde raus welchen Drittschlüssel ich brauche?

      Dankeschön für die super Hilfe schonmal :)
    • toleit00
      toleit00
      Bronze
      Dabei seit: 27.01.2007 Beiträge: 2.451
      Eine Frage hab ich noch: Wie mache ich denn einen Join über 2 Tabellen die keine gleichen Attribute haben? Also bspw tourneydata und playerhandstourneymisc würd ich gerne verknüpfen, die haben aber keinerlei Spalten gleich, sodass ich die ganzen SchlüsselA=SchlüsselB Sachen garnicht machen kann. Da brauch ich wahrscheinlich irgendwelche Schlüssel die in einer dritten Tabelle stehen oder? Wie seh ich denn die Struktur der Schlüssel und finde raus welchen Drittschlüssel ich brauche?


      ja genau über ne 3te Tabelle

      Wo man hier die Schlüssel sehen kann weiß ich leider auch nicht.
      Notfalls halt die bisschen Zeit investieren und die Tabellen Attribute durchschauen. Nervt aber weiß leider grad au keine andere Möglichkeit.
    • Rilko
      Rilko
      Bronze
      Dabei seit: 23.12.2006 Beiträge: 575
      Hab mir das mal angeschaut.

      Du brauchst folgendes:

      code:
      SELECT hands.*  
      FROM playervsplayer AS pvp
      INNER JOIN playerhandstourneykeycolumns_hero as hands ON pvp.pokerhand_id = hands.pokerhand_id 
      WHERE pvp.player_id = 2 AND pvp.villain_id = 25946 AND hands.streetwentallin != 0


      Wobei du halt noch villain_id ersetzen musst. Außerdem weiß ich nicht, ob damit preflopallins auch abgedeckt sind, weil ich keine SNGs/MTTs spiele... denke mal die verwenden -1 für preflop... sollte also gehen.
    • Rilko
      Rilko
      Bronze
      Dabei seit: 23.12.2006 Beiträge: 575
      Original von ChrisA3
      Eine Frage hab ich noch: Wie mache ich denn einen Join über 2 Tabellen die keine gleichen Attribute haben? Also bspw tourneydata und playerhandstourneymisc würd ich gerne verknüpfen, die haben aber keinerlei Spalten gleich, sodass ich die ganzen SchlüsselA=SchlüsselB Sachen garnicht machen kann. Da brauch ich wahrscheinlich irgendwelche Schlüssel die in einer dritten Tabelle stehen oder? Wie seh ich denn die Struktur der Schlüssel und finde raus welchen Drittschlüssel ich brauche?

      Dankeschön für die super Hilfe schonmal :)
      Alle Hände eines Turniers: playerhandstourneykeycolumns.tourneynumber = id, dann über pokerhand_id inner joinen auf playerhandstourneymisc.pokerhand_id ... und schon hast du die verbunden.

      tourneydata läuft auch über tourneynumber.

      Btw... ohne SQL Kenntnisse/DB Erfahrung wird das der Overkill für dich...
    • rawman81
      rawman81
      Bronze
      Dabei seit: 27.10.2008 Beiträge: 7.787
      Original von Rilko
      Btw... ohne SQL Kenntnisse/DB Erfahrung wird das der Overkill für dich...
      Naja man muss ja nur wissen wie nen SELECT aufgebaut ist und wie Primär-/Fremdschlüsselkopplung funktioniert (und entsprechend joined bei der select-abfrage).

      Alles Weitere ist eigentlich nur (viel) Fleissarbeit :)
    • Rilko
      Rilko
      Bronze
      Dabei seit: 23.12.2006 Beiträge: 575
      Original von rawman81
      Alles Weitere ist eigentlich nur (viel) Fleissarbeit :)
      Sicherlich nicht... spätestens wenn er andere JOIN Arten als INNER braucht... und vielleicht nochn HAVING... ist Schluss.
    • ChrisA3
      ChrisA3
      Bronze
      Dabei seit: 25.08.2005 Beiträge: 6.481
      So, hab meinen ersten großen Query mit Join über die Dritttabelle zustande gekriegt :) Danke auch für deinen Quellcode Rilko auch wenn ich den leider nicht benutzt habe, weil ich noch ein paar Attribute aus playerhandstourneykeycolumns gebraucht habe die ich dann abfragen kann, ist aber auf jeden Fall nett von dir und vielleicht brauch ich sowas auch nochmal um die speziellen vsplayer Sachen rauszufinden. Vielen Dank für die nette Hilfe auf jeden Fall, hab jetzt quasi den ganzen Tag damit verbracht aber ist cool dass es jetzt geht :)
    • Rilko
      Rilko
      Bronze
      Dabei seit: 23.12.2006 Beiträge: 575
      Kannst das Query ja hier mal reinstellen - gibt bestimmt Leute, die das auch interessieren würde.
    • ChrisA3
      ChrisA3
      Bronze
      Dabei seit: 25.08.2005 Beiträge: 6.481
      code:
      SELECT playerhandstourneykeycolumns.tourneynumber, pokerhand_id,holecardvalue_id 
      FROM playerhandstourneykeycolumns
      INNER JOIN playerhandstourneymisc ON playerhandstourneymisc.playerhand_id = playerhandstourneykeycolumns.playerhand_id
      INNER JOIN tourneydata ON playerhandstourneykeycolumns.tourneynumber = tourneydata.tourneynumber
      WHERE playerhandstourneykeycolumns.player_id = abc AND playerhandstourneykeycolumns.didvpip = TRUE AND (playerhandstourneykeycolumns.netamountwon < -80000 OR playerhandstourneykeycolumns.netamountwon > 80000) AND tourneydata.tourneysize=6


      Hier mal mein erstes Beispiel alle Pötte größer 1600 chips eines bestimmten Spielers, mit keycolumns kann man aber noch weiter filtern.
    • toleit00
      toleit00
      Bronze
      Dabei seit: 27.01.2007 Beiträge: 2.451
      finds gut das es noch Leute die gibt die sich auch mal selber aufen "Arsch" hocken können und sich sowas selber ausarbeiten :)
      Denk is au vernünftig da nen Tag zu opfern wenn in die Richtung noch mehr machen willst.

      well done
    • netsrak
      netsrak
      Gold
      Dabei seit: 11.03.2006 Beiträge: 36.838
      Falls ihr euch die Datenbank Abfragen von Holdemmanger direkt ansehen wollt:

      Close down HM and open the holdemmanager.config with notepad and change
      <setting name="LogDatabaseCommands">False
      To
      <setting name="LogDatabaseCommands">True

      Now run the report and when it finishes look in the logs folder for a file named dbtrace.log and open it with Wordpad and go to the bottom of the file and you will see the query.
    • Rafzahn
      Rafzahn
      Bronze
      Dabei seit: 28.11.2007 Beiträge: 129
      Habe auch mal sowas mit der Elephant-DB versucht. Problem ist nur dass man fuer eine einzige Abfrage gleich den ganzen Tag braucht ;) Was haltet ihr davon, mal eine Komplette Sektion im Forum dafür zu reservieren, wo jeder mal seinen eigenen SQL-Befehl posten kann sei es fuer HM oder Elephant?

      Die besten könnte man dann evtl. in den Elephant übernehmen...
    • toleit00
      toleit00
      Bronze
      Dabei seit: 27.01.2007 Beiträge: 2.451
      Original von netsrak
      Falls ihr euch die Datenbank Abfragen von Holdemmanger direkt ansehen wollt:

      Close down HM and open the holdemmanager.config with notepad and change
      <setting name="LogDatabaseCommands">False
      To
      <setting name="LogDatabaseCommands">True

      Now run the report and when it finishes look in the logs folder for a file named dbtrace.log and open it with Wordpad and go to the bottom of the file and you will see the query.
      danke! vn
      werd ich sicher au noch gebrauchen :)
    • Rilko
      Rilko
      Bronze
      Dabei seit: 23.12.2006 Beiträge: 575
      Wird mir auch helfen... bin gerade dabei nen Javaprogramm zu bauen, dass die HEM Database auswertet um Fische und Leaks von Spielern anhand von selbst zu definierenden Rules zu identifizieren... die Ergebnisse werden dann direkt in die Playernotes Datei geschrieben (für Ongame). Bin ma gespannt wie das so wird. Das wird die Tableselection erleichtern und einem das Leben hoffentlich einfacher machen :)
    • 1
    • 2