所以我有一张看起来像这样的表:
╔═════════╦══════════════════════╦════════════╗
║ User_id ║ Start_date ║ Review_id ║
╠═════════╬══════════════════════╬════════════╣
║ 1 ║ 26/08/2016 17:32:42 ║ 150 ║
║ 1 ║ 26/07/2016 16:23:42 ║ 149 ║
║ 2 ║ 26/07/2016 14:13:42 ║ 148 ║
║ 3 ║ 26/06/2016 12:32:42 ║ 147 ║
║ 1 ║ 26/06/2016 12:32:42 ║ 146 ║
║ 1 ║ 26/06/2016 12:33:42 ║ 145 ║
║ 2 ║ 24/06/2016 14:33:42 ║ 144 ║
║ 2 ║ 23/06/2016 12:33:42 ║ 143 ║
╚═════════╩══════════════════════╩════════════╝
最终可能会有数百个条目。我需要做的是返回一个表格,告诉我每个用户每个月完成了多少次评论。
我已经尝试返回整个评论列表并通过PHP订购它们,但我不知道如何最终得到的结果如下:
╔═════════╦══════════════════════╗
║ User_id ║ Date ║ # Reviews ║
╠═════════╬══════════════════════╣
║ 1 ║ 08/2016 ║ 1 ║
║ 1 ║ 07/2016 ║ 1 ║
║ 1 ║ 06/2016 ║ 2 ║
║ 2 ║ 07/2016 ║ 1 ║
║ 2 ║ 06/2016 ║ 2 ║
║ 3 ║ 06/2016 ║ 1 ║
... ... ...
我最初的方法是在数据库中搜索所有发生的评论。然后通过PHP解析它们(保存将所有压力放在DB上进行分组)。我已成功使用以下内容按ID分组:
//List of the users - returned from DB
$userList = array(1,2,3);
//List of all the reviews - returned from DB
$reviewList = array(
[0] => array("user_id" => 1, "start_date"=> 26/08/2016 17:32:42),
[1] => ...);
foreach ($userList as $user){
foreach ($reviewList as $review){
if($review['user_id'] == $user){
$reviewarray[$user] = $reviewarray[$user] + 1;
}
}
}
但我非常确定它不是最有效的方法。它也没有按日期解析,这是我被困的地方。
我很欣赏我所提供的并不完整的文章,但我所采取的所有其他途径都得到了非常好的结果。如果您需要更多信息,请与我们联系。
答案 0 :(得分:1)
您可以直接在sql中使用month和group
select User_id, date_format(start_date, '%Y-%m') as `Date`, count(*)
from my_table
group by User_id, date_format(start_date, '%Y-%m')
答案 1 :(得分:1)
我认为您不需要或者应该在PHP代码中进行此类聚合。相反,让MySQL为你工作;它是专为此而设计的。
您可以使用用户的ID和月 - 年组合作为群组进行GROUP BY
查询。
SELECT User_id,
DATE_FORMAT(Start_date, '%Y-%m'),
COUNT(*) AS `# Reviews`
FROM yourTable
GROUP BY User_id,
DATE_FORMAT(Start_date, '%Y-%m')
答案 2 :(得分:0)
您在SQL中计算的内容非常简单:
select user_id, date_format(start_date, '%Y-%m') as yyyymm, count(*)
from t
group by user_id, date_format(start_date, '%Y-%m')
order by user_id, date_format(start_date, '%Y-%m');