1

私は大まかに次のようないくつかのテーブルを持っています:

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

やりたいこと: 1 人の顧客に少なくとも 1 通の電子メールを書いたすべての従業員と、その 1 人の顧客に宛てた電子メールの中で悪態をついた回数 (つまり、特定のClient返品)を取得したい

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

私が試したこと:

ORM の使用に慣れているため、SQL についての私の理解はかなり弱いものです。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そこへのすべての電子メールの合計であるようです。ClientEmployee

ここで何かをひどく誤解していると感じているので、これをうまく行う方法の例を誰かが提供できれば、いくつかの指針をいただければ幸いです。

4

2 に答える 2

3

テーブルを結合した結果をグループ化します。

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
于 2012-07-03T22:03:17.827 に答える
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;

emailstatsLEFT JOIN を使用して、一致する行が実際に存在するという保証がないように見えるため、確認します。

于 2012-07-03T22:05:39.313 に答える