mysql - 是否可以在来自 3 个表的 SQL 查询中使用两个 COUNT 和两个 JOIN?

标签 mysql sql count left-join heidisql

所以我在这里要做的是获取一份报告,了解不同用户发送了多少封电子邮件(使用类似 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 | ... |
|          ... | ...            |        ... | ...            | ... |
---------------------------------------------------------------------

最佳答案

使用 COUNT(DISTINCT ...) :

SELECT
    CONCAT(Usernames.FirstName, ' ', Usernames.LastName) AS 'Full Name',
    Usernames.Username,
    COUNT(Sent_Mail_Contacts.IDContact) AS `Total Sent`,
    COUNT(DISTINCT 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`

注意:虽然这不会使查询更快。首先,您至少应确保在 JOIN 中使用主键/外键关系:Usernames(Username)Sent_Mail_Contacts(Username) , Mass_Mail(用户名)

关于mysql - 是否可以在来自 3 个表的 SQL 查询中使用两个 COUNT 和两个 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54951948/

相关文章:

php - 友情系统

mysql - Mysql2::Error-用户'root'@'localhost'的访问被拒绝(使用密码:是)

mysql - 炸毁服务器的 SQL 查询

sql - SQL将一个值替换为另一个

dynamic - 传单 : Dynamically count number of feaures loaded into a layer

mysql - 总结初始列 mysql

php - Mysql:将数据数组存储在单个列中

c# asp.net - 将数据插入数据库(不知道哪里出错了)

sql - 带计数的简单 sql 查询

MySQL count(DISTINCT) 非常慢 - 子查询更好?