Sorry about the formatting.. Grrr..  Should be in columns as:

a.originalMessage_ID, a.newMessage_ID, c.EMailAddress AS SenderAddress,
d.EMailAddress AS NewAddress

-----Original Message-----
From: Jeff Beer [mailto:[EMAIL PROTECTED]] 
Sent: Wednesday, November 20, 2002 2:29 PM
To: CF-Talk
Subject: SQL: self-joins and counts - lots of detail


Hi folks,

I'm stumped on a SQL query.  Using SQL Server 7.0.

I have two tables - one with a lot of detail info, and one as a cross
reference.  The detail table (msgs) has a primary key (message_id) and
an e-mail address (emailAddress), plus other stuff that doesn't matter
for now.  The cross reference table (xref_forwards) has
originalMessage_ID and newMessage_ID.

When someone forwards an e-mail message to another person, the system
currently checks to see if the new address (the forward to address) is
present in the system.  If so, it inserts a record into the cross
reference table with the message_id of the sender, and the existing
message_id of the recipient.  If the new address is not present, it adds
a record for that address, grabs the new message_ID, and inserts a
record into the cross reference table.

Pretty straightforward stuff so far.

What's beating me up is writing a query that will return the original
sender's email address and the people that person forwarded the message
to, with a count of how many mails were forwarded per original email
address.  So far I have:

SELECT     a.originalMessage_ID, a.newMessage_ID, c.EMailAddress AS
SenderAddress, d.EMailAddress AS NewAddress, COUNT(a.originalMessage_ID)

                      AS totalforwards
FROM         xref_forwarding a INNER JOIN
                      xref_forwarding b ON a.originalMessage_ID =
b.newMessage_ID INNER JOIN
                      msgs c ON a.originalMessage_ID = c.Message_ID
INNER JOIN
                      msgs d ON a.newMessage_ID = d.Message_ID GROUP BY
a.originalMessage_ID, a.newMessage_ID, c.EMailAddress, d.EMailAddress
ORDER BY a.originalMessage_ID

This seems to work fine.  Here's example output from the above query:
(in all the output, the domain names are changed so I don't get
screenscraped by spammers - the numbers all match up with the original
domains).

a.originalMessage_ID, a.newMessage_ID, c.EMailAddress AS SenderAddress,
d.EMailAddress AS NewAddress  663352 663352 [EMAIL PROTECTED]
[EMAIL PROTECTED]  663352 670110 [EMAIL PROTECTED] [EMAIL PROTECTED]
663352 671038 [EMAIL PROTECTED] [EMAIL PROTECTED]  663352 714066
[EMAIL PROTECTED] [EMAIL PROTECTED]  663352 714187 [EMAIL PROTECTED]
[EMAIL PROTECTED]  663353 670109 [EMAIL PROTECTED] [EMAIL PROTECTED]
663353 670110 [EMAIL PROTECTED] [EMAIL PROTECTED]  663353 714066
[EMAIL PROTECTED] [EMAIL PROTECTED]  670110 714046 [EMAIL PROTECTED]
[EMAIL PROTECTED]  670110 714188 [EMAIL PROTECTED]
[EMAIL PROTECTED]  671038 663352 [EMAIL PROTECTED] [EMAIL PROTECTED]
671038 663353 [EMAIL PROTECTED] [EMAIL PROTECTED]  671038 714186
[EMAIL PROTECTED] [EMAIL PROTECTED]  714066 671038 [EMAIL PROTECTED]
[EMAIL PROTECTED]  714066 714181 [EMAIL PROTECTED] [EMAIL PROTECTED]
714066 714182 [EMAIL PROTECTED] [EMAIL PROTECTED]  714066 714183
[EMAIL PROTECTED] [EMAIL PROTECTED]  714066 714184 [EMAIL PROTECTED]
[EMAIL PROTECTED]  714066 714185 [EMAIL PROTECTED] [EMAIL PROTECTED]
714188 671036 [EMAIL PROTECTED] [EMAIL PROTECTED]  714188 671038
[EMAIL PROTECTED] [EMAIL PROTECTED]  714188 714187 [EMAIL PROTECTED]
[EMAIL PROTECTED]

The counts add up fine - I tested manually, writing down who sent mail
to whom.

When I add a count column the results are still the same, but the counts
are wrong:

SELECT     a.originalMessage_ID, a.newMessage_ID, c.EMailAddress AS
SenderAddress, d.EMailAddress AS NewAddress, COUNT(a.originalMessage_ID)

                      AS TotalForwards
FROM         xref_forwarding a INNER JOIN
                      xref_forwarding b ON a.originalMessage_ID =
b.newMessage_ID INNER JOIN
                      msgs c ON a.originalMessage_ID = c.Message_ID
INNER JOIN
                      msgs d ON a.newMessage_ID = d.Message_ID GROUP BY
a.originalMessage_ID, a.newMessage_ID, c.EMailAddress, d.EMailAddress
ORDER BY a.originalMessage_ID

outputting:

a.originalMessage_ID, a.newMessage_ID, c.EMailAddress AS SenderAddress,
d.EMailAddress AS NewAddress, COUNT(a.originalMessage_ID) 
 663352 663352 [EMAIL PROTECTED] [EMAIL PROTECTED] 2  663352
670110 [EMAIL PROTECTED] [EMAIL PROTECTED] 2  663352 671038
[EMAIL PROTECTED] [EMAIL PROTECTED] 2  663352 714066
[EMAIL PROTECTED] [EMAIL PROTECTED] 2  663352 714187
[EMAIL PROTECTED] [EMAIL PROTECTED] 2  663353 670109
[EMAIL PROTECTED] [EMAIL PROTECTED] 1  663353 670110
[EMAIL PROTECTED] [EMAIL PROTECTED] 1  663353 714066
[EMAIL PROTECTED] [EMAIL PROTECTED] 1  670110 714046 [EMAIL PROTECTED]
[EMAIL PROTECTED] 2  670110 714188 [EMAIL PROTECTED]
[EMAIL PROTECTED] 2  671038 663352 [EMAIL PROTECTED]
[EMAIL PROTECTED] 3  671038 663353 [EMAIL PROTECTED]
[EMAIL PROTECTED] 3  671038 714186 [EMAIL PROTECTED]
[EMAIL PROTECTED] 3  714066 671038 [EMAIL PROTECTED] [EMAIL PROTECTED] 2
714066 714181 [EMAIL PROTECTED] [EMAIL PROTECTED] 2  714066 714182
[EMAIL PROTECTED] [EMAIL PROTECTED] 2  714066 714183 [EMAIL PROTECTED]
[EMAIL PROTECTED] 2  714066 714184 [EMAIL PROTECTED]
[EMAIL PROTECTED] 2  714066 714185 [EMAIL PROTECTED]
[EMAIL PROTECTED] 2  714188 671036 [EMAIL PROTECTED] [EMAIL PROTECTED]
1  714188 671038 [EMAIL PROTECTED] [EMAIL PROTECTED] 1  714188 714187
[EMAIL PROTECTED] [EMAIL PROTECTED] 1

As you can see, the last three rows, the sender [EMAIL PROTECTED]
should count 3 forwards. I thought that by grouping on the original
message_id the counts would roll up as well.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Archives: http://www.houseoffusion.com/cf_lists/index.cfm?forumid=4
Subscription: 
http://www.houseoffusion.com/cf_lists/index.cfm?method=subscribe&forumid=4
FAQ: http://www.thenetprofits.co.uk/coldfusion/faq
This list and all House of Fusion resources hosted by CFHosting.com. The place for 
dependable ColdFusion Hosting.

Reply via email to