【问题标题】:Insert one column after selecting multiple多选后插入一列
【发布时间】:2014-01-01 16:52:23
【问题描述】:

这是我的表的样子(MYSQL)

Data_Table
org_id | site_id | site | mailing_list | email_address | report_date
1        1         abc.com, list_1,  one@abc.com,   2013-12-13
1        1         abc.com, list_1,  two@abc.com,   2013-12-13
1        1         abc.com, list_1,  three@abc.com, 2013-12-13
1        1         abc.com, list_2,  one@abc.com,   2013-12-13
1        2         cba.com, list_A,  four@abc.com,  2013-12-13
1        2         cba.com, list_A,  one@abc.om,    2013-12-13
2        1         bla.com, listbla, one@abc.com,   2013-12-13

所以,我正在尝试计算(email_address) 的数量并将其插入到 Report_Table 中。

Report_Table(End Product/GOAL)
org_id | site_id | site | count_mailing_lists | aggregate_email_count | unique_email_count
1,       1,        abc.com,      2,                       4,                   3
1,       2,        cba.com,      1,                       2,                   2

在我说我是如何尝试解决问题之前,让我先介绍一下数据。所以 Organizations(org_id) 可以有任意数量的站点,这些站点可以有任意数量的邮件列表。邮件列表有电子邮件地址。必须进行多个 mysql 查询 - 因此在找到 count(email_address) 后,我必须加入它或将其添加到报告表中。

为了找到 aggregate_email_count, - 它需要“双重计算”电子邮件地址。因此,在上面的 Data_Table 中,需要有一个 aggregate_email_count 对:Org1/Site1、Org1/Site2、Org2/Site1。棘手的部分是 one@abc.com——它存在于 Org1 的邮件列表和 Org2 的邮件列表中。

我找到了 unique_email_count 的 select 语句,但不知道如何将它插入到已经填充的表中。这些计数是报告的 3 部分中的第 2 部分,因此已经存在将所有站点映射到其邮件列表的表。这是目前的样子。

Report_Table
org_id | site_id | site | count_mailing_lists | aggregate_email_count | unique_email_count
1,       1,        abc.com,      NULL,                       NULL,                   NULL
1,       2,        cba.com,      NULL,                       NULL,                   NULL

这是我寻找 unique_email_count 的尝试:

SELECT count(distinct b.site_id, b.email) FROM censored.Data_Table b;

这将返回两列 (site_id&email),我需要将电子邮件计数插入到 Report_Table 中,以匹配 site_id 和 site_ids。他们都有 site_id 所以我想这是直截了当的。

查找聚合(这不起作用):

INSERT INTO censor.Report_Table (Aggregate_Email_Count)
SELECT b.site_id, b.MAILING_LIST_ID, count(b.email)
FROM censor.Data_Table b
RIGHT JOIN censor.Report_Table a AS b
GROUP BY b.MAILING_LIST_ID;

还有我对 count_mailing_lists 的第三个查询

INSERT INTO censor.Report_Table (Mailing_List_Count)
SELECT count(distinct b.MAILING_LIST_ID, b.site_ID)
FROM censor.Data_Table b;

完成后,报告将显示每个组织的唯一电子邮件,以及电子邮件的数量,包括存在于多个邮件列表中的电子邮件。通过这种方式,我们可以告诉我们的客户“嘿,您有 100 万个唯一联系人、8 个邮件列表和 800 万个聚合联系人。不要让我们的服务器陷入困境”

帮助我告诉我如何加入它们,但对于 site_id 的每个实例(在 Report_Table 中)插入计数(唯一),对于 Org_ID 的每个实例插入计数(聚合)。

谢谢!

【问题讨论】:

    标签: mysql sql join insert distinct


    【解决方案1】:

    这是你想要的吗?

    INSERT INTO censor.Report_Table (org_id, site_id, site, count_mailing_lists, 
                                     aggregate_email_count, unique_email_count
                                    )
        SELECT dt.org_id, dt.site_id, dt.site,
               count(distinct mailing_list),
               count(email),
               count(distinct email)
        FROM censor.Data_Table dt
        GROUP BY dt.org_id, dt.site_id, dt.site;
    

    您可以使用单个查询填充Report_Table——这表明您也可以使用视图而不是具体化表。

    编辑:

    以上内容一次为报表创建了所有列。如果您只想更新值,则可以使用 updatejoin

    update censor.Report_Table rt join
           (SELECT dt.org_id, dt.site_id, dt.site,
                   count(distinct mailing_list) as numml,
                   count(email) as nume,
                   count(distinct email) as numde
            FROM censor.Data_Table dt
            GROUP BY dt.org_id, dt.site_id, dt.site
           ) toupdate
           on rt.org_id = toupdate.org_id and
              rt.site_id = toupdate.site_id
        set unique_email_count = topudate.numde;
    

    【讨论】:

    • 我觉得你打错了,你输入了“dt.site_id, dt.site_id”——你是说org_id吗?这看起来很有希望
    • 并选择 dt.site_id 和 dt.site 指的是本质上相同的对象
    • @J-Dizzle 。 . .是的,这是一个错字。
    • 这创建了一个新行,而不是将其与现有数据配对
    • 我知道我有 20 封唯一的电子邮件和 45 封汇总,但 count(email) 返回 720。感谢您的更新(双关语)。是什么让 count(email) 不计算它不应该的东西?即使使用 count(dt.email) 它也会返回 720
    【解决方案2】:

    考虑一下:

    SELECT  
      org_id, site_id, site, 
      COUNT(DISTINCT mailing_list) AS count_mailing_lists,
      COUNT(email_address) AS aggregate_email_count,
      COUNT(DISTINCT email_address) AS unique_email_count
    FROM Data_Table
    GROUP BY org_id, site_id WITH ROLLUP
    

    On SQLFiddle here

    每次使用上述查询的结果重新填充您的Report_Data

    WITH ROLLUP 选项可根据需要为您提供方便的小计。

    【讨论】:

    • SQLFiddle 很酷! Org_ID 和 mailing_list 是主键 - 所以对于这个虚拟数据,它应该是 'Org-1 Site-1 ML-1 Aggregate-4 Unique-3' 'Org-1 Site-1 ML-1 Aggregate-4 Unique-3' 'Org-1 Site-1 ML-2 Aggregate-4 Unique-1' 'Org-2 Site-1 ML-1 Aggregate-1 Unique-1' 所以聚合与 org 配对,并且 unique 与 ML 配对
    • 啊,是的。发现其中的错误。更正并更新了 SQLFiddle 链接。但!您不能拥有“Org-1 Site-1 ML-1 ...”,因为数据表明 org=1 & site=1 具有 list_1 和 list_2 所以这是“Org-1 Site-1 ML-2 .. .'
    • 我不相信 SQLFiddle,因为它说 cba.com 有 3 个邮件列表
    • 这是整个 org_id = 1 (site_id = NULL) 的汇总行,其中有 3 个邮件列表 :) site 列在这里没有意义,所以它只是数据库引擎的第一个值遇到,所有其他列都适用于整个org_id = 1
    • sqlfiddle 上的结果集有一些针对 site_id 和/或 org_id 的空值,我不明白这些是如何产生的。你说得对,组织 1 有 3 个邮件列表
    猜你喜欢
    • 2016-05-14
    • 2017-09-25
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多