Jeena Paradies: Hash aus DB erstellen

Hallo allerseits,

Ich habe viele Spiele, und für jedes ist so ein Eintrag in der Datenbank:

game_id | team_id | state

18      | 12       | 1
18      | 21       | 1
18      | 21       | 2
18      | 21       | 2
18      | 12       | 3
18      | 12       | 3
18      | 21       | 4

SELECT game_id, team_id, state, COUNT(*) AS teamgoals
 FROM goals
 GROUP BY game_id, team_id, state
 ORDER BY game_id, team_id, state

while row = fetch
 ???
end

Am ende möchte ich in etwa so ein Array haben:

allGames = {
 game_id => {
  teamA_id => [goals_state1, goals_state2, goals_state3, goals_state4],
  teamB_id => [goals_state1, goals_state2, goals_state3, goals_state4]
 }
 18 => {
  12 => [1,0,2,0],
  21 => [1,2,0,1]
 }
 172=>{64=>[2,1,1,0],32=>[0,0,2,1]}
}

Das Ziel der Übung ist es dann einfach und schnell an Daten heranzukommen und nicht tausend mal die Datenbank für jedes Spiel anzufragen. Wie muss das aber in der while Schleife aussehen, damit am ende so ein Array herauskommt? Irgendwie stehe ich seit einiger Zeit auf dem Schlauch...

Grüße
 /Jeena

  1. Hi,

    hab leider keine Lösung für dein problem, nur zwei Anmerkungen:

    1.) Du suchst keinen Hash. Ein Hash ist üblicherweise eine Prüfsumme über bestimmte Daten, die man nutzt um Fehler oder Veränderungen in den Daten identifizieren zu können ohne den kompletten datensatz wieder 1:1 vergleichen zu müssen.

    2.) Deine Problembeschreibung ist äußerst schwer verständlich. Du erklärst nicht was die einzelnen Datensätze sein sollen und dein gewünschter Ergebnissarray ist auch alles andere als eindeutig, sondern lässt sehr viel Interpretationsspielraum welche Daten du jetzt eigentlich wo hin haben willst. Das macht es ausgesprochen schwer bzw. zeitintensiv da irgendwie zu helfen.

    Marc

    1. Hallo,

      1.) Du suchst keinen Hash. Ein Hash ist üblicherweise eine Prüfsumme über bestimmte Daten, die man nutzt um Fehler oder Veränderungen in den Daten identifizieren zu können ohne den kompletten datensatz wieder 1:1 vergleichen zu müssen.

      Ich suche nach einer Möglichkeit ein Assoziatives Array zur Datenhaltung zu erstellen, auch Dictionary, Map, oder eben Hash genannt. Sorry wenn das undeutlich rüberkam.

      2.) Deine Problembeschreibung ist äußerst schwer verständlich. Du erklärst nicht was die einzelnen Datensätze sein sollen

      Jeder Datensatz in der DB soll ein Tor darstellen. Die Tore sollen dann mit COUNT(*) schon von der Datenbank für jeden state pro team und game zusammengerechnet werden. So dass dann in etwa so eine Tabelle herauskommen sollte:

      game_id | team_id | state_id | goals

      und dein gewünschter Ergebnissarray ist auch alles andere als eindeutig, sondern lässt sehr viel Interpretationsspielraum welche Daten du jetzt eigentlich wo hin haben willst.

      Hm. Also im Prinzip möchte ich die Datenbank so abbilden, dass ich sehr schnell auf die einzelnen Daten zugreifen kann. Ich möchte zum Beispiel schnell und einfach auf die Anzahl der Tore im Spiel #122 der Mannschaft #23 wärend Status auf 1 war feststellen, oder die Tore aller Staten zusammenrechnen können um das Endergebniss zu bekommen. Wie jetzt der Hash am ende genau aussieht ist eigentlich egal. Es wird auch nie wieder in den Hash geschrieben sondern nur noch gelesen, nachdem er erstellt worden ist.

      Aber wenn ich mir die Tabelle so angucke die da rauskommt, dann wäre es doch eigentlich einfach so zu machen (in PHP jetzt als Beispiel):

      while ( $row = $db->fetch() ) {  
       $games[ $row['game_id'] = array(  
        $row['team_id'] => array(  
          $row['state_id'] => $row['team_goals']  
         )  
       );  
      }
      

      Wenn ich dann auf die Anzahl der Tore aus Spiel #3 des Teams #21 in state #1 zugreifen möchte kann ich das darüber machen:

      echo $games[3][21][1];

      und wenn ich alle Tore dieses Teams in diesesm Spiel haben möchte, dann:

      $all_goals = 0;  
      foreach ( $games[3][21] AS $goals ) {  
       $all_goals = $all_goals + $goals;  
      }  
      echo $all_goals;
      

      Grüße
      Jeena Paradies

      1. echo $begrüßung;

        Aber wenn ich mir die Tabelle so angucke die da rauskommt, dann wäre es doch eigentlich einfach so zu machen (in PHP jetzt als Beispiel):

        while ( $row = $db->fetch() ) {

        $games[ $row['game_id'] = array(
          $row['team_id'] => array(
            $row['state_id'] => $row['team_goals']
           )
        );
        }

          
        Ja, nur dass du nicht immer neue Arrays erstellen darfst, weil du dir dabei die alten Werte überschreibst. Greif einfach auf die Felder so zu, als ob das Array schon da wäre.  
        Wenn du nicht für alle Status oder Teams oder was auch immer einen Wert hast, müsstest du entweder beim Anlegen erfragen, ob es das state\_id-zu-team\_goals-Array noch nicht gibt und dann anlegen, oder beim Abfragen isset()s einbauen.  
          
          
        echo "$verabschiedung $name";
        
        1. Hallo,

          Ja, nur dass du nicht immer neue Arrays erstellen darfst, weil du dir dabei die alten Werte überschreibst. Greif einfach auf die Felder so zu, als ob das Array schon da wäre.

          Oh ah ja stimmt, das habe ich ja ganz übersehen. Jetzt habe ich das in Ruby so: ~~~ruby @games[row['game_id']][row['team_id']][row['state_id']] = row['team_goals']

            
          
          > Wenn du nicht für alle Status oder Teams oder was auch immer einen Wert hast, müsstest du entweder beim Anlegen erfragen, ob es das state\_id-zu-team\_goals-Array noch nicht gibt und dann anlegen, oder beim Abfragen isset()s einbauen.  
          
          Jo ich hatte sowieso vor beim abfragen das zu überprüfen und fals nichts gesetzt ist eine 0 zu setzen.  
            
          Grüße  
          Jeena Paradies
          
          -- 
          [Absolut in Bezug auf das Elternelement positioniern](http://jeenaparadies.net/weblog/2006/sep/absolut-positionieren) eine Anleitung | [Jlog](http://jeenaparadies.net/webdesign/jlog/) | [Gourmetica Mentiri](http://jeenaparadies.net/gourmetica-mentiri/)