这是我的表格(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>
谢谢!
答案 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
每次使用上述查询的结果重新填充Report_Data
。
WITH ROLLUP
选项可根据需要为您提供方便的小计。