基本上,我尝试做的是从上个月(目前所有论坛)获得前x名誉用户。如果已经被问到这个问题,我很抱歉,但我已经搜索过,并且找不到任何东西。
表格结构:
注意:我只在这里显示相关列,还有更多。
声誉
id | given_by | post_id | vote | time_given
1 | 2 | 1 | 1 | 1390763007
2 | 6 | 2 | -1 | 1390763013
3 | 7 | 2 | -1 | 1390763013
(下表中每个投票都有一个条目)
帖子
id | poster_id | reputation | posted
1 | 4 | 1 | 1390763013
2 | 3 | -2 | 1390763013
3 | 8 | 4 | 1390763013
4 | 4 | 5 | 1390763013
有一个主题表和论坛表,我最终也会介绍。但是我真的想先让它工作。
$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,例如,如果他们在过去一个月内获得了超过一点的声誉。不知何故,我需要一个函数来对函数变量求和,它将在posts表中将海报x的所有声誉加起来,再没有相同海报的行,只显示正面的声誉,并按声誉分组降序排序 - 因此上表中的示例应该如下所示:MySQL:
poster_id | reputation
4 | 6
8 | 4
它是我努力的分组部分,我可以通过PHP来做到这一点,但我更倾向于通过MySQL来做,只需要遍历结果。
我宁愿在一个查询中使用此功能,但最多只能使用两个。
答案 0 :(得分:0)
您可以对表格中的字段进行计算。您只需按选择中的其他项进行分组,如下所示:
SELECT poster_id, sum(reputation) as reputation
FROM posts
group by poster_id