选择多个后插入一列

时间:2013-12-13 19:41:03

标签: mysql sql join insert distinct

这是我的表格(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

在我说出我是如何尝试解决问题之前,让我告诉你有关数据的信息。因此,组织(org_id)可以拥有任意数量的站点,这些站点可以拥有任意数量的邮件列表。邮件列表包含电子邮件地址。必须进行多次mysql查询 - 所以在找到计数(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),我需要将电子邮件计数插入到与site_id匹配的Report_Table匹配的site_id中。他们都有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插入计数(聚合)实例 < / p>

谢谢!

2 个答案:

答案 0 :(得分:2)

这是你想要的吗?

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 - 这表示您也可以使用视图而不是实现表格。

编辑:

以上为报告表创建了所有列。如果您只想更新该值,则可以update使用join

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;

答案 1 :(得分: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选项可根据需要为您提供方便的小计。