Mailinglisten-Archive |
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