我正在尝试为过渡到不同阶段的用户生成多个条形图。以下是user_stage_mappings表的结构
+----+----------+---------+------------------+----------------+
| id | stage_id | user_id | stage_start_date | stage_end_date |
+----+----------+---------+------------------+----------------+
| 1 | 1 | 1 | 2017-12-25 | 2018-01-02 |
| 2 | 2 | 1 | 2018-01-02 | 2018-01-05 |
| 3 | 3 | 1 | 2018-02-05 | |
+----+----------+---------+------------------+----------------+
现在我想为每个阶段绘制3个单独的图表,从2018年1月1日到2018年1月7日(日期可以是任何范围)。所以图表看起来如下。
第1阶段图表: 1月1日和2月显示1个计数的酒吧,因为这个时期的想法是在第1阶段,其余时间没有酒吧。
第2阶段图表: 1月2日至5日显示1个计数的酒吧,因为这个时期的想法是在第2阶段,1月1日,6日和7月没有酒吧。
第3阶段图表: 在1月5日至7日期间显示1个计数栏,因为这个时期的想法是在第3阶段,注意最后阶段没有结束日期,表明这个想法仍处于第3阶段。
我已将数据集减少到最小,实际数据集将在不同阶段具有多个用户。什么是最好的方式来写这个作为mysql查询。
我想也许可以循环到1月1日到7日,每次迭代都会计算用户数量。例如,对于1月1日,获取1月1日在stage_start_date和stage_end_date之间的用户,但不知何故,这感觉不是最佳的。
对我来说,通过循环绘制图表会更容易。我解释一下,首先获得每天的用户数量:
SELECT DATE(stage_start_date) stage_start_date, count(DISTINCT user_id) NoOfUsers
FROM user_stage_mappings
WHERE stage_start_date BETWEEN STR_TO_DATE('2018-01-01','%Y-%m-%d')
AND STR_TO_DATE('2018-01-07','%Y-%m-%d')
GROUP BY DATE(stage_start_date)
ORDER BY DATE(stage_start_date);
此数据可以由仪表板的应用程序层获取,并存储在数组中。现在,您可以通过根据索引操作数组来获取不同的阶段图表数据。试图直接从数据库获取完整的预期信息将是一个痛苦的屁股。