【问题标题】:Multiple grouped counts against categories and subcategories针对类别和子类别的多个分组计数
【发布时间】: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


    【解决方案1】:

    问题的原始版本没有指定 MySQL 5.7。这个答案需要 MySQL 8.0。

    但我认为这只是一个带有窗口函数的聚合查询:

    SELECT ct.entry_id,
           DATE(FROM_UNIXTIME(ct.entry_date)) AS entry_date,
           cg.group_name,
           COUNT(*) as value,
           SUM(COUNT(*)) OVER (PARTITION BY entry_id,  DATE(FROM_UNIXTIME(ct.entry_date)) as total
    FROM category_posts cp JOIN
         channel_titles ct
         ON ct.entry_id = cp.entry_id JOIN
         categories c
         ON c.cat_id = cp.cat_id JOIN
         category_groups cg
         ON cg.group_id = c.group_id
    WHERE cg.group_name IN ( 'Group A', 'Group B' )
    GROUP BY entry_date, group_name;
    

    我删除了 LEFT JOINs,因为您的数据似乎都匹配,并且您的结果在键列中没有 NULL 值。

    【讨论】:

    • 抱歉,澄清一下,有什么不一致的地方?我会纠正我的问题。我尝试了您的查询,但 SUM(COUNT(*)) OVER (PARTITION BY 方面似乎不起作用 - 这绝对是 MySQL 语法吗?
    • @Forest 。 . .您的查询中没有 typeOVER 是一个窗口函数,从 MySQL 8.0 开始在 MySQL 中得到支持。
    • 谢谢,我已经更正了。第一个块旨在成为所需的输出而不是当前的数据格式,但我可以理解为什么这会让人难以理解。我还在我的问题中澄清了这是针对 MySQL 5.7 的——我正在向旧系统添加功能。
    猜你喜欢
    • 2023-03-11
    • 2022-09-30
    • 1970-01-01
    • 2011-12-03
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2015-10-15
    相关资源
    最近更新 更多