转换查询MySQL表以返回按用户ID和放大器分组的列表的最有效方法。按日期(以PHP格式)

时间:2016-08-30 16:06:40

标签: php mysql

所以我有一张看起来像这样的表:

╔═════════╦══════════════════════╦════════════╗
║ 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;
                }

            }
        }

但我非常确定它不是最有效的方法。它也没有按日期解析,这是我被困的地方。

我很欣赏我所提供的并不完整的文章,但我所采取的所有其他途径都得到了非常好的结果。如果您需要更多信息,请与我们联系。

3 个答案:

答案 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');