【发布时间】:2019-03-01 20:36:37
【问题描述】:
所以我在这里要做的是获取一份关于不同用户发送了多少电子邮件(使用类似 MailChimp 的应用程序)的报告,但我希望一个查询中有两个不同的指标。我想知道每个用户发送了多少封单独的电子邮件。这意味着如果他们每人向 100 个联系人发送 3 封电子邮件,则显示为 300。但我还想知道发送了多少独特的电子邮件,这意味着将显示 3。
我想要一些类似的东西:
-------------------------------------------------------------
| Full Name | Username | Total Sent | Unique Mails |
|-------------|-----------------|------------|--------------|
| John Doe | jdoe@mail.com | 12000 | 4 |
| James Smith | jsmith@mail.com | 6000 | 12 |
| Jane Jones | jjones@mail.com | 4000 | 2 |
| ... | ... | ... | ... |
-------------------------------------------------------------
所以我可以知道 John 向很多联系人发送了几封电子邮件,而 James 向更少的联系人发送了更多电子邮件。
这是我的查询的样子。我已经更改了表名和列名,但这是对它的准确表示。
SELECT
CONCAT(Usernames.FirstName, ' ', Usernames.LastName) AS 'Full Name',
Usernames.Username,
COUNT(Sent_Mail_Contacts.IDContact) AS `Total Sent`,
COUNT(Mass_Mail.IDMass_Mail) AS `Individual E-Mails`
FROM Usernames
LEFT JOIN Sent_Mail_Contacts ON Usernames.Username = Sent_Mail_Contacts.Username
LEFT JOIN Mass_Mail ON Usernames.Username = Mass_Mail.Username
GROUP BY Usernames.Username
ORDER BY `Total Sent`
我有一个包含用户名的表格,一个包含电子邮件的个人联系人的表格,以及一个包含唯一电子邮件的表格。
那么我的查询是否有意义?这甚至可能吗?因为现在当我运行它时,它给了我这样的东西:
-------------------------------------------------------------
| Full Name | Username | Total Sent | Unique Mails |
|-------------|-----------------|------------|--------------|
| John Doe | jdoe@mail.com | 12000 | 12000 |
| James Smith | jsmith@mail.com | 6000 | 6000 |
| Jane Jones | jjones@mail.com | 4000 | 4000 |
| ... | ... | ... | ... |
-------------------------------------------------------------
我只是在两列中给了我相同的数字,并且需要 7 分钟来处理。
如果有帮助,下面是 3 个表格分别显示的示例:
Usernames
------------------------------------------------
| Username | FirstName | LastName | ... |
|-----------------|-----------|----------|-----|
| jdoe@mail.com | John | Doe | ... |
| jsmith@mail.com | James | Smith | ... |
| jjones@mail.com | Jane | Jones | ... |
| ... | ... | ... | ... |
------------------------------------------------
Mass_Mail
----------------------------------------------------
| ID_Mass_Mail | Username | Date | ... |
|--------------|----------------|------------|-----|
| 1 | jdoe@mail.com | 2019-01-16 | ... |
| 2 | jdoe@mail.com | 2019-01-29 | ... |
| 3 | jjones@mail.com| 2019-02-14 | ... |
| ... | ... | ... | ... |
----------------------------------------------------
Sent_Mail_Contacts
---------------------------------------------------------------------
| ID_Mass_Mail | Username | Contact_ID | Contact_Email | ... |
|--------------|----------------|------------|----------------|------
| 1 | jdoe@mail.com | 1 | bob@mail.com | ... |
| 1 | jdoe@mail.com | 2 | jim@mail.com | ... |
| 1 | jdoe@mail.com | 3 | cindy@mail.com | ... |
| ... | ... | ... | ... | ... |
| 2 | jdoe@mail.com | 4 | mike@mail.com | ... |
| 2 | jdoe@mail.com | 2 | jim@mail.com | ... |
| 2 | jdoe@mail.com | 3 | cindy@mail.com | ... |
| ... | ... | ... | ... | ... |
---------------------------------------------------------------------
【问题讨论】:
-
附带说明:数据模型似乎有点缺陷。为什么
Sent_Mail_Contacts既有Contact_ID又有Contact_Email?如果联系人有 ID,则应该有一个联系人表,并且该表应该每个联系人 ID 有一行,并包含相关的电子邮件地址。然后你在Sent_Mail_Contacts中有Username。为什么?ID_Mass_Mail是否可以为空,所以有些行您无法从那里获取用户?否则,Mass_Mail和Sent_Mail_Contacts中不同的用户名会表示什么?带有虚假帐户的电子邮件?让您的数据库摆脱冗余。标准化。
标签: mysql sql count left-join heidisql