获取上个月的所有记录,每个用户一个结果,每个用户最多一列
Get all records from previous month WITH one result per user AND maximum column per user
基本上,我想做的是获取上个月(目前所有论坛)中排名前 x 位的用户。如果有人问过这个问题,我深表歉意,但我已经搜索过但没有找到任何东西。
table结构:
注意:我这里只显示相关栏目,还有更多。
声望
id | given_by | post_id | vote | time_given
1 | 2 | 1 | 1 | 1390763007
2 | 6 | 2 | -1 | 1390763013
3 | 7 | 2 | -1 | 1390763013
(下面的table每投票一个条目)
帖子
id | poster_id | reputation | posted
1 | 4 | 1 | 1390763013
2 | 3 | -2 | 1390763013
3 | 8 | 4 | 1390763013
4 | 4 | 5 | 1390763013
还有一个主题table和论坛table,我最终也会介绍。但我真的想让它先简单地工作。
$date = getdate(time());
$time = mktime(0, 0, 0, $date['mon'], 1, $date['year']);
//$sql = "SELECT u.username, u.id, u.group_id, p.reputation FROM reputation AS r LEFT JOIN posts AS p ON r.post_id = p.id LEFT JOIN users AS u ON p.poster_id = u.id WHERE p.reputation > '0' AND p.posted <= :time ORDER BY p.posted DESC";
$sql1 = "SELECT p.id FROM posts AS p WHERE p.id = :id";
$ps1 = $pdo->prepare($sql);
$sql = "SELECT r.post_id FROM reputation AS r WHERE r.time_given >= :time ORDER BY r.time_given DESC";
$ps = $pdo->prepare($sql);
$ps->execute(array(':time'=>$time));
$ps->setFetchMode(PDO::FETCH_ASSOC);
foreach ($ps as $reputation)
{
print_r($reputation);
$ps1->execute(array(':id'=>$reputation['post_id']));
}
第一个查询有效,但它会多次显示发帖者 ID,例如,如果他们在过去一个月内获得了不止一点的声誉。不知何故,我需要一个函数来对函数变量求和,它将把帖子 table 中海报 x 的所有声誉加起来,不再有相同海报的行,仅显示正面声誉并按声誉按降序分组 - 所以上面 table 中的示例应该从 MySQL:
看起来像这样
poster_id | reputation
4 | 6
8 | 4
这是我正在努力解决的分组部分,我可以通过 PHP 来完成,但我更愿意通过 MySQL 来完成,并且只需要循环遍历结果。
我宁愿在一个查询中使用它,但最多两个。
您可以对 table 中的字段进行计算。您只需要按 select 中的其他项目分组,如下所示:
SELECT poster_id, sum(reputation) as reputation
FROM posts
group by poster_id
基本上,我想做的是获取上个月(目前所有论坛)中排名前 x 位的用户。如果有人问过这个问题,我深表歉意,但我已经搜索过但没有找到任何东西。
table结构:
注意:我这里只显示相关栏目,还有更多。
声望
id | given_by | post_id | vote | time_given
1 | 2 | 1 | 1 | 1390763007
2 | 6 | 2 | -1 | 1390763013
3 | 7 | 2 | -1 | 1390763013
(下面的table每投票一个条目)
帖子
id | poster_id | reputation | posted
1 | 4 | 1 | 1390763013
2 | 3 | -2 | 1390763013
3 | 8 | 4 | 1390763013
4 | 4 | 5 | 1390763013
还有一个主题table和论坛table,我最终也会介绍。但我真的想让它先简单地工作。
$date = getdate(time());
$time = mktime(0, 0, 0, $date['mon'], 1, $date['year']);
//$sql = "SELECT u.username, u.id, u.group_id, p.reputation FROM reputation AS r LEFT JOIN posts AS p ON r.post_id = p.id LEFT JOIN users AS u ON p.poster_id = u.id WHERE p.reputation > '0' AND p.posted <= :time ORDER BY p.posted DESC";
$sql1 = "SELECT p.id FROM posts AS p WHERE p.id = :id";
$ps1 = $pdo->prepare($sql);
$sql = "SELECT r.post_id FROM reputation AS r WHERE r.time_given >= :time ORDER BY r.time_given DESC";
$ps = $pdo->prepare($sql);
$ps->execute(array(':time'=>$time));
$ps->setFetchMode(PDO::FETCH_ASSOC);
foreach ($ps as $reputation)
{
print_r($reputation);
$ps1->execute(array(':id'=>$reputation['post_id']));
}
第一个查询有效,但它会多次显示发帖者 ID,例如,如果他们在过去一个月内获得了不止一点的声誉。不知何故,我需要一个函数来对函数变量求和,它将把帖子 table 中海报 x 的所有声誉加起来,不再有相同海报的行,仅显示正面声誉并按声誉按降序分组 - 所以上面 table 中的示例应该从 MySQL:
看起来像这样poster_id | reputation
4 | 6
8 | 4
这是我正在努力解决的分组部分,我可以通过 PHP 来完成,但我更愿意通过 MySQL 来完成,并且只需要循环遍历结果。
我宁愿在一个查询中使用它,但最多两个。
您可以对 table 中的字段进行计算。您只需要按 select 中的其他项目分组,如下所示:
SELECT poster_id, sum(reputation) as reputation
FROM posts
group by poster_id