【问题标题】:Performing a SUM over nested Foreign Key relationships对嵌套的外键关系执行 SUM
【发布时间】:2012-07-03 21:56:02
【问题描述】:

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

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 return

[
    ('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 的人),但诅咒计数似乎是所有发送到该 Client 的电子邮件的总数,而不仅仅是那些来自Employee的诅咒。

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

【问题讨论】:

  • 没有建设性,但你为什么样的公司工作?诅咒你的客户?大声笑!

标签: mysql sql sqlite postgresql


【解决方案1】:

您想对加入表格的结果进行分组:

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

【讨论】:

    【解决方案2】:
    SELECT em.name, sum(s.curse_words) AS total_curses
    FROM   employee em
    JOIN   email e ON e.from = em.id
    LEFT   JOIN emailstats s ON s.email = e.id
    WHERE  e.to = $the_one_client
    GROUP  BY em.name
    ORDER  BY total_curses DESC;
    

    我使用 LEFT JOIN 来确保 emailstats 中的匹配行确实存在,因为似乎无法保证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2014-06-16
      • 2020-03-19
      • 2022-08-05
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多