基本上,我想做的是在(目前所有论坛)中获得上个月的前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,例如,如果他们在过去一个月里获得了多个声誉。不知怎的,我需要一个函数来对函数变量求和,它将按posters表中的poster x将所有信誉相加,不再有同一poster的行,只显示正面信誉,并按信誉降序排列-所以上表中的例子应该是MySQL中的这样:
poster_id | reputation
4 | 6
8 | 4
这是我正在努力解决的分组部分,我可以通过PHP来完成,但我更愿意通过MySQL来完成,只需要循环查看结果。
我宁愿将其放在一个查询中,但最多只能放在两个查询中。
您可以对表中的字段进行计算。你只需要按照选择中的其他项目进行分组,就像这样:
SELECT poster_id, sum(reputation) as reputation
FROM posts
group by poster_id