mysql - 对嵌套的外键关系执行 SUM

标签 mysql sql sqlite postgresql

我有一些表大致是这样的:

Client:
   id
   name

Employee 
   id 
   name

Email
   id
   to : Client [ForeignKey]
   from : Employee [ForeignKey]

EmailStats (Tracks the stats for a particular single email)
   id
   email : Email [OneToOne]
   curse_words : 10

我想做什么:我想获取所有至少给一个客户写过一封电子邮件的员工,以及他们的次数我在他们发给那个单一客户的任何一封电子邮件中都诅咒过,即针对特定的 Client 返回

[
    ('name' : 'Paul', 'total_curses' : 255),
    ('name' : 'Mary', 'total_curses' : 10),
]

我尝试过的:

我对 SQL 的理解很薄弱,因为我习惯于使用 ORM。我无法理解 Employees 的正常检索如何链接到诅咒词的计数。这是我所做的(客气点!):

SELECT DISTINCT (
    SELECT SUM(EmailStats.curse_words)
    FROM EmailStats
    INNER JOIN (
      SELECT Email.id
      FROM Email
      INNER JOIN Employee
          ON Email.from = Employee.id
      WHERE Email.to = 5 // Assuming 5 is the client's id
    ) filtered_emails ON EmailStats.email = filtered_emails.id                
) AS 'total_curses', Employee.name
FROM Employee
INNER JOIN Email
   ON  Email.from = Employee.id 
WHERE Email.to = 5 // Assuming 5 is the client's id
ORDER_BY 'total_curses'

这不起作用 - 它似乎获取了正确的 Employees(那些发送给 Client 的人),但 curses 计数似乎是所有人的总数向该 Client 发送电子邮件,而不仅仅是来自该 Employee 的那些诅咒。

我觉得我在这里严重误解了一些东西,所以如果有人能提供一个如何成功解决这个问题的例子,我将不胜感激。

最佳答案

您想对连接表的结果进行分组:

SELECT   Employee.name, SUM(EmailStats.curse_words) total_curses
FROM     Email
  JOIN EmailStats ON EmailStats.email = Email.id
  JOIN Employee   ON Employee.id      = Email.from
WHERE    Email.to = 5
GROUP BY Employee.id
ORDER BY total_curses DESC

关于mysql - 对嵌套的外键关系执行 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319762/

相关文章:

sql - 相当于 MySQL 的 DESCRIBE [表] 的 Oracle 和/或 SQL Server?

android - 使用基于从普通表中选择语句的 FTS3/4 表

mysql - 由于重叠日期从 MySQL 表中删除冗余条目

sql - T-SQL查询建议

mysql - 查询花费太多时间并影响性能

Android webview地理定位数据库打开失败

c# - 内存流作为数据库

c# - MySQLConnector C# 更新MySqlCommand参数

PHP - 如何比较两列?

mysql - 管理 runserver - 加载 MySQLdb 模块时出错