phpbar.de logo

Mailinglisten-Archive

[php] Gruppierung von Daten

[php] Gruppierung von Daten

Alexander Manhart php_(at)_phpcenter.de
Thu, 18 Oct 2001 13:36:54 +0200


Hallo Liste,

wem mein Prob und meine Lösung interessiert:

Alexander M. schrieb:
> ich habe folgendes in einer tabelle:
>
> message
> 4
> 5
> 4
> 4
> 5
> 4
> 4
> 4
> 5
> 5
> 4
> 4
> 4
> 4
> 4
>
> daraus möchte ich folgendes ergebnis haben:
> message count
> 4           1
> 5           1
> 4           2
> 5           1
> 4           3
> 5           2
> 4           5
>
> d.h. ich möchte gruppen bilden und diese zählen (nach jedem
change/änderung
> des vorherigen satzes).
> mit group by message erlange ich nur (ist mir auch klar):
> message count
> 4           11
> 5           4
>
> momentan fällt mir nur eine möglichkeit ein, alle
> sätze einzeln durchgehen und mir die gruppen in einem
> array zusammen zu fassen. aber die tabelle besitzt
> >2.000.000 Datensätze
>
> tja, wenns per sql nicht möglich ist, wie schaffe
> ich es in php am effizientesten?

  ich habe das problem jetzt wie folgt gelöst:

   define ("SHM_KILL", 4); //message
   define ("SHM_DEATH", 5);

   define ("TEAMCT", "CT");
   define ("TEAMT", "TERRORIST");

  $MAP = 'de_vertigo'; $MONTH = 10; $YEAR = 2001; $GSID = 100; // tut nichts
zur Sache
  $NICKNAME = 'blabla';

  function get_player_mapstreaks($NICKNAME, $GSID, $MAP, $MONTH, $YEAR)
  {
    $sql = "SELECT e.message, e.tstamp FROM Events e LEFT JOIN Games g ON ".
           "g.id = e.gameid AND g.gsid = $GSID AND g.map = '$MAP' AND ".
           "MONTH(g.start) = $MONTH AND YEAR(g.start) = $YEAR WHERE ".
           "(e.message = ".SHM_KILL." OR e.message = ".SHM_DEATH.") AND
e.user = '$NICKNAME'";

    $arr_streak = myANRS_GetSQLResult($sql);
    unset($sql);

    $z = 0;
    $arr = array();
    if (is_array($arr_streak))
    {
      foreach($arr_streak as $key => $arr_val)
      {
        $playerteam = get_player_team($NICKNAME, $GSID, $arr_val["tstamp"]);
        $message = $arr_val["message"];

        if (($last_playerteam != $playerteam) OR ($last_message !=
$message))
        {
          $z = 0;
        }

        $z++;

        switch ($playerteam)
        {
          case TEAMCT: if ($message == SHM_KILL)
                       {
                         if ($z > $best_kstreakct)
                         {
                           $arr["KILL"][$playerteam] = $z;
                           $best_kstreakct = $z;
                         }
                       }
                       elseif ($message == SHM_DEATH)
                       {
                         if ($z > $best_dstreakct)
                         {
                           $arr["DEATH"][$playerteam] = $z;
                           $best_dstreakct = $z;
                         }
                       }
          case TEAMT : if ($message == SHM_KILL)
                       {
                         if ($z > $best_kstreakt)
                         {
                           $arr["KILL"][$playerteam] = $z;
                           $best_kstreakt = $z;
                         }
                       }
                       elseif ($message == SHM_DEATH)
                       {
                         if ($z > $best_dstreakt)
                         {
                           $arr["DEATH"][$playerteam] = $z;
                           $best_dstreakt = $z;
                         }
                       }
        }

        $last_playerteam = $playerteam;
        $last_message = $message;
      }
    }

    return $arr;
  }

--
Alexander M.



php::bar PHP Wiki   -   Listenarchive