按日期过滤现有查询
Filtering existing query by date
这还没有用功能性的答案来回答。
我有一些方法,我将它们放在一起,以获得我经常玩的游戏的一些有趣的统计数据。
下面的方法将获取所有游戏的总数,将玩家与玩家列表匹配,然后显示总数的总和 wins/loss/ties。
这很棒,而且很实用。
但是,由于大众需求,我被要求调整查询以考虑游戏开始的日期。我想将其过滤到最后 30 天的总和。我该怎么做?
我想在花时间重写整个东西之前四处询问。最好,一切都保持不变,只是按日期过滤。
数据库的日期键是checkSumID
它是一个 UNIX 时间戳。
private function topPlayers() {
$topPlayersList = array();
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie")
)
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
$i = 0;
foreach ($playersList as $playerListData) {
if ($playerListData->wins + $playerListData->loss + $playerListData->tie >= 25) {
$avgPick = $this->getPlayerAvgPickCount($playerListData->playerID);
$playerRecordID = $playerListData->playerID;
$playerNameLookup = Players::where([
'player_id' => $playerListData->playerID
])->first();
$playerListData->playerID = $playerNameLookup->player_name;
$topPlayersList[$i] = array(
'name' => $playerNameLookup->player_name,
'total' => +$playerListData->wins + +$playerListData->loss + +$playerListData->tie,
'wins' => +$playerListData->wins,
'loss' => +$playerListData->loss,
'tie' => +$playerListData->tie,
'percent' => +$playerListData->loss == 0 ? 0 : round(
(+$playerListData->wins / (+$playerListData->wins + +$playerListData->loss) * 100),
2
) . ' %',
'avg_pick' => $avgPick[0]->average,
'player_id' => $playerRecordID
);
$i++;
}
}
return $this->sortArray($topPlayersList,'percent','DESC');
}
我写了一个方法,可以做类似的事情,但更多的是在一个人的基础上,但不确定如何在不完全重写的情况下将两者拼接在一起。
这是方法
private function getTotalGamesPlayed30DayWinLossTies() {
//PickupResults::where('playerID', '=', $this->getPlayerID())->where('checkSumID', '=', Carbon::now()->subDays(30)->timestamp)->count()
$results = PickupResults::get();
//$results = PickupResults::where('playerID', '=', $this->getPlayerID())->get();
$count = 0;
$wins = 0;
$loss = 0;
$tie = 0;
foreach ($results as $result) {
if ($result->playerID === $this->playerID) {
$timeStamp = $result->checkSumID;
$converted = date('m/d/Y', $timeStamp / 1000);
if (strtotime($converted) > strtotime('-30 days')) {
$count = $count + 1;
if ($result->gameResult === 'Win') {
$wins = $wins + 1;
}
if ($result->gameResult === 'Loss') {
$loss = $loss + 1;
}
if ($result->gameResult === 'Tie') {
$tie = $tie + 1;
}
}
}
}
return
array(
'total' => $count,
'wins' => $wins,
'loss' => $loss,
'tie' => $tie,
'percent' => $loss == 0 ? 0 : round(($wins / ( $wins + $loss) * 100 ),2) . ' %'
);
}
如有任何帮助,我们将不胜感激。
当使用 Arun P 的答案时
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie"))
->where('checksumID','<',$now)->where('checksumID','>',$thirty_days_ahead)
->groupBy('playerID')
->orderBy('wins', 'DESC')
->get();
它将 return 0 个结果。这是不正确的;我试图收集玩家在过去 30 天内玩过的所有游戏。不多也不少。
您可以访问 http://www.Krayvok.com/t1 并查看统计页面以获取工作示例。
我正在尝试获取当前排行榜,该排行榜显示所有玩家玩过的游戏总数。我想对其进行过滤,以仅显示从今天开始的过去 30 天内(滚动 30 天)玩过游戏的玩家。
试试这个
from_unixtime()
returns 来自 unix 时间戳的 date/datetime
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie")
)
->where(DB::raw("from_unixtime(checkSumID) > date_sub(now(), interval 30 day)"))
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
试试这个,像这样更新您的查询
$thirty_days_ahead = date('Y-m-d H:i:s', strtotime("-30 days"));
$now = date('Y-m-d H:i:s', strtotime("0 days"));
$results = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie"))
->where('checksumID','<',$now)->where('checksumID','>',$thirty_days_ahead)
->groupBy('playerID')
->orderBy('wins', 'DESC')
->get();
试试这个 -
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' AND checkSumID > '".now()->subDays(30)->toDateString()."' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' AND checkSumID > '".now()->subDays(30)->toDateString()."' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' AND checkSumID > '".now()->subDays(30)->toDateString()."' THEN 1 END) AS tie")
)
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
Laravel 创建 carbon date instance for now()
as mentioned in its documentation. Chaining the above carbon methods (carbon docs) returns 30 天前的日期。
所有 SELECT
语句将转换为类似这样的内容(当当前日期为“2019-07-06”时)-
COUNT(CASE WHEN gameResult = 'Win' AND checkSumID > '2019-06-06' THEN 1 END) AS wins
这将计算在“2019-06-06”(过去 30 天内)之后创建的结果包括当前日期。
我对您现有的查询做了一些更改,
$timestamp_from = date('Y-m-d', strtotime('-30 days'));
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie")
)
->where(DB::raw("DATE((checkSumID/1000)) >= '{$timestamp_from}'"))
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
在您的方法 getTotalGamesPlayed30DayWinLossTies
中,checkSumID
被除以 1000,我已将其包含在查询中。 checkSumID
的 where 子句已更改为比较日期。
如果您需要任何帮助,请尝试发表评论。
这还没有用功能性的答案来回答。
我有一些方法,我将它们放在一起,以获得我经常玩的游戏的一些有趣的统计数据。
下面的方法将获取所有游戏的总数,将玩家与玩家列表匹配,然后显示总数的总和 wins/loss/ties。
这很棒,而且很实用。
但是,由于大众需求,我被要求调整查询以考虑游戏开始的日期。我想将其过滤到最后 30 天的总和。我该怎么做?
我想在花时间重写整个东西之前四处询问。最好,一切都保持不变,只是按日期过滤。
数据库的日期键是checkSumID
它是一个 UNIX 时间戳。
private function topPlayers() {
$topPlayersList = array();
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie")
)
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
$i = 0;
foreach ($playersList as $playerListData) {
if ($playerListData->wins + $playerListData->loss + $playerListData->tie >= 25) {
$avgPick = $this->getPlayerAvgPickCount($playerListData->playerID);
$playerRecordID = $playerListData->playerID;
$playerNameLookup = Players::where([
'player_id' => $playerListData->playerID
])->first();
$playerListData->playerID = $playerNameLookup->player_name;
$topPlayersList[$i] = array(
'name' => $playerNameLookup->player_name,
'total' => +$playerListData->wins + +$playerListData->loss + +$playerListData->tie,
'wins' => +$playerListData->wins,
'loss' => +$playerListData->loss,
'tie' => +$playerListData->tie,
'percent' => +$playerListData->loss == 0 ? 0 : round(
(+$playerListData->wins / (+$playerListData->wins + +$playerListData->loss) * 100),
2
) . ' %',
'avg_pick' => $avgPick[0]->average,
'player_id' => $playerRecordID
);
$i++;
}
}
return $this->sortArray($topPlayersList,'percent','DESC');
}
我写了一个方法,可以做类似的事情,但更多的是在一个人的基础上,但不确定如何在不完全重写的情况下将两者拼接在一起。
这是方法
private function getTotalGamesPlayed30DayWinLossTies() {
//PickupResults::where('playerID', '=', $this->getPlayerID())->where('checkSumID', '=', Carbon::now()->subDays(30)->timestamp)->count()
$results = PickupResults::get();
//$results = PickupResults::where('playerID', '=', $this->getPlayerID())->get();
$count = 0;
$wins = 0;
$loss = 0;
$tie = 0;
foreach ($results as $result) {
if ($result->playerID === $this->playerID) {
$timeStamp = $result->checkSumID;
$converted = date('m/d/Y', $timeStamp / 1000);
if (strtotime($converted) > strtotime('-30 days')) {
$count = $count + 1;
if ($result->gameResult === 'Win') {
$wins = $wins + 1;
}
if ($result->gameResult === 'Loss') {
$loss = $loss + 1;
}
if ($result->gameResult === 'Tie') {
$tie = $tie + 1;
}
}
}
}
return
array(
'total' => $count,
'wins' => $wins,
'loss' => $loss,
'tie' => $tie,
'percent' => $loss == 0 ? 0 : round(($wins / ( $wins + $loss) * 100 ),2) . ' %'
);
}
如有任何帮助,我们将不胜感激。
当使用 Arun P 的答案时
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie"))
->where('checksumID','<',$now)->where('checksumID','>',$thirty_days_ahead)
->groupBy('playerID')
->orderBy('wins', 'DESC')
->get();
它将 return 0 个结果。这是不正确的;我试图收集玩家在过去 30 天内玩过的所有游戏。不多也不少。
您可以访问 http://www.Krayvok.com/t1 并查看统计页面以获取工作示例。
我正在尝试获取当前排行榜,该排行榜显示所有玩家玩过的游戏总数。我想对其进行过滤,以仅显示从今天开始的过去 30 天内(滚动 30 天)玩过游戏的玩家。
试试这个
from_unixtime()
returns 来自 unix 时间戳的 date/datetime
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie")
)
->where(DB::raw("from_unixtime(checkSumID) > date_sub(now(), interval 30 day)"))
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
试试这个,像这样更新您的查询
$thirty_days_ahead = date('Y-m-d H:i:s', strtotime("-30 days"));
$now = date('Y-m-d H:i:s', strtotime("0 days"));
$results = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie"))
->where('checksumID','<',$now)->where('checksumID','>',$thirty_days_ahead)
->groupBy('playerID')
->orderBy('wins', 'DESC')
->get();
试试这个 -
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' AND checkSumID > '".now()->subDays(30)->toDateString()."' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' AND checkSumID > '".now()->subDays(30)->toDateString()."' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' AND checkSumID > '".now()->subDays(30)->toDateString()."' THEN 1 END) AS tie")
)
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
Laravel 创建 carbon date instance for now()
as mentioned in its documentation. Chaining the above carbon methods (carbon docs) returns 30 天前的日期。
所有 SELECT
语句将转换为类似这样的内容(当当前日期为“2019-07-06”时)-
COUNT(CASE WHEN gameResult = 'Win' AND checkSumID > '2019-06-06' THEN 1 END) AS wins
这将计算在“2019-06-06”(过去 30 天内)之后创建的结果包括当前日期。
我对您现有的查询做了一些更改,
$timestamp_from = date('Y-m-d', strtotime('-30 days'));
$playersList = DB::table('pickup_results')
->select(DB::raw("playerID"),
DB::raw("COUNT(CASE WHEN gameResult = 'Win' THEN 1 END) AS wins"),
DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"),
DB::raw("COUNT(CASE WHEN gameResult = 'Tie' THEN 1 END) AS tie")
)
->where(DB::raw("DATE((checkSumID/1000)) >= '{$timestamp_from}'"))
->groupBy('playerID')
->orderBy('wins','DESC')
->get();
在您的方法 getTotalGamesPlayed30DayWinLossTies
中,checkSumID
被除以 1000,我已将其包含在查询中。 checkSumID
的 where 子句已更改为比较日期。
如果您需要任何帮助,请尝试发表评论。