【发布时间】:2014-07-06 19:23:33
【问题描述】:
我有一个成员列表数据库表(.MDB MS-Access,通过 ColdFusion 访问),其中包含四个电子邮件地址字段(email1、email 2、email3、email4)- ALL IN SAME TABLE。
我需要开发一个查询来生成所有电子邮件服务提供商域(例如 gmail.com、comcast.net 等)的列表以及每个域的数量,以及所有四个域的组合这些领域。期望的结果应该是一个看起来像这样的列表:
comcast.net (6)
gmail.com (14)
cs.com (1)
hotmail.com (4)
att.net (12)
aol.com (2)
. . . . etc.
到目前为止,我可以为每个字段单独执行此操作,但是当我在所有四个字段中创建以下 UNION 查询查询时,我接近了我想要的,但它列出了每个人的总数字段而不是将它们相加。所以,我得到:
att.net (2)
att.net (3)
att.net (9)
att.net (13)
aol.com (6)
aol.com (4)
aol.com (1)
aol.com (8)
. . . etc.
而不是想要的:
att.net (27)
aol.com (19)
. . . etc.
我怎样才能让它们结合在一起?谢谢你的帮助!这是我的代码:
<!--- get list of ESP domain names (e.g. comcast.net) from members' email addresses --->
<!--- email address one --->
<cfquery name="cfqGetESP1" datasource="#member_datasource#">
SELECT MID(email1, INSTR(email1, '@') + 1)
AS esp
FROM tblMembers
WHERE email1 IS NOT NULL
</cfquery>
<!--- email address two --->
<cfquery name="cfqGetESP2" datasource="#member_datasource#">
SELECT MID(email2, INSTR(email2, '@') + 1)
AS esp
FROM tblMembers
WHERE email2 IS NOT NULL
</cfquery>
<!--- email address three --->
<cfquery name="cfqGetESP3" datasource="#member_datasource#">
SELECT MID(email3, INSTR(email3, '@') + 1)
AS esp
FROM tblMembers
WHERE email3 IS NOT NULL
</cfquery>
<!--- email address four --->
<cfquery name="cfqGetESP4" datasource="#member_datasource#">
SELECT MID(email4, INSTR(email4, '@') + 1)
AS esp
FROM tblMembers
WHERE email4 IS NOT NULL
</cfquery>
<!--- Query of Queries to get COMBINED total instances of EACH ESP --->
<!--- across ALL four email address fields --->
<cfquery name="cfqCountESP" dbtype="query">
SELECT esp, COUNT(esp) AS instances
FROM cfqGetESP1
GROUP BY esp
UNION
SELECT esp, COUNT(esp) AS instances
FROM cfqGetESP2
GROUP BY esp
UNION
SELECT esp, COUNT(esp) AS instances
FROM cfqGetESP3
GROUP BY esp
UNION
SELECT esp, COUNT(esp) AS instances
FROM cfqGetESP4
GROUP BY esp
ORDER BY esp ASC
</cfquery>
<!--- test display --->
<p>TEST DISPLAY COUNT ESP ACROSS ALL EMAIL ADDRESS FIELDS<br>
<cfoutput>
<cfloop query="cfqCountESP">
#cfqCountESP.esp# (#instances#)<br>
</cfloop>
</cfoutput>
【问题讨论】:
-
这是 MS Access 的一大痛点。可以使用其他数据库吗?
-
还可以考虑规范化电子邮件地址。如果地址存储在行中而不是列中,则此查询会简单得多:
MemberEmail (Columns: MemberID, EmailAddress)。这种结构也更加灵活,允许每个成员根据需要发送尽可能多的电子邮件。
标签: sql ms-access coldfusion