【发布时间】:2020-11-20 06:59:11
【问题描述】:
我正在尝试从 MySQL 5.7 数据库中查询分析数据,以便在前端显示。这些数据是多对多结构的,我想聚合两列,一列基于上一列中的信息,按日期分组和计数。
目的是获取以下格式的数据(见示例数据):
entry_date | cat_name | subcat_name | subcat_count | total_count
-----------|----------|-------------|--------------|------
2020-07-28 | #TestOne | Alpha | 1 | 2
2020-07-28 | #TestOne | Delta | 1 | 2
2020-07-27 | #TestTwo | Bravo | 1 | 2
2020-07-27 | #TestTwo | Charlie | 1 | 2
2020-07-26 | #TestOne | Charlie | 1 | 2
2020-07-26 | #TestOne | Bravo | 1 | 2
2020-07-25 | #TestTwo | Delta | 1 | 2
2020-07-25 | #TestTwo | Alpha | 1 | 2
在上述数据中,value 是在给定日期针对给定场景的给定类型的数量,total 是在给定日期针对场景的所有类型的数量。因此,如果一天有 100 个类型为 Alpha 的帖子,则该值将是 100,总数将是 100。如果还有 100 个类型为 Delta 的帖子,总数将变为 200。
在意识到自己迷路之前,我已经走到了这一步:
SELECT
ct.entry_id,
DATE(FROM_UNIXTIME(ct.entry_date)) AS entry_date,
cg.group_name,
c.cat_name
FROM
category_posts cp
LEFT JOIN channel_titles ct ON ct.entry_id = cp.entry_id
LEFT JOIN categories c ON c.cat_id = cp.cat_id
LEFT JOIN category_groups cg ON cg.group_id = c.group_id
WHERE
cg.group_name = 'Group A'
OR cg.group_name = 'Group B'
GROUP BY
entry_date,
group_name,
cat_name
ORDER BY
entry_id,
FIELD(group_name, 'Group A', 'Group B')
这以不可靠且不太有用的格式返回数据,但没关系 - 如果您可以绝对确定 A 组中存在记录,而我不能。
entry_id | entry_date | group_name | cat_name
---------|------------|------------|---------
1 | 2020-07-28 | Group A | #TestOne
1 | 2020-07-28 | Group B | Alpha
1 | 2020-07-28 | Group B | Delta
2 | 2020-07-27 | Group A | #TestTwo
2 | 2020-07-27 | Group B | Bravo
2 | 2020-07-27 | Group B | Charlie
3 | 2020-07-26 | Group A | #TestOne
3 | 2020-07-26 | Group B | Charlie
3 | 2020-07-26 | Group B | Bravo
4 | 2020-07-25 | Group A | #TestTwo
4 | 2020-07-25 | Group B | Delta
4 | 2020-07-25 | Group B | Alpha
实体关系图
示例数据
category_groups
group_id | group_name
---------|------------------------------
1 | Group A
2 | Group B
类别
cat_id | group_id | cat_name
-------|----------|-------------------
1 | 1 | #TestOne
2 | 1 | #TestTwo
3 | 2 | Alpha
4 | 2 | Bravo
5 | 2 | Charlie
6 | 2 | Delta
category_posts
cat_id | entry_id
-------|---------
1 | 1
2 | 2
1 | 3
2 | 4
3 | 1
4 | 2
5 | 3
6 | 4
6 | 1
5 | 2
4 | 3
3 | 4
频道标题
entry_id | entry_date
---------|-----------
1 | 1595940540 (07/28/2020)
2 | 1595882160 (07/27/2020)
3 | 1595721600 (07/26/2020)
4 | 1595635200 (07/25/2020)
【问题讨论】:
标签: mysql sql database relational-database mysql-5.7