2011-04-13 79 views
0

我有四個表結構如下每個小組成員的意見:查詢計數

  1. panelistspanelist_idfirst_namelast_name等)
  2. projectsproject_idtitlecreated_date等。 )
  3. panelists_on_projectspp_idpanelist_idproject_id等)
  4. commentscomment_idpanelist_idproject_id等)

想象一下我對同一個項目( 「X」)4名專業評委,但只有小組成員3都留下了評論。我試圖找出一個查詢來計算每個小組成員的評論,併爲附加到項目x的小組成員返回一個零,但誰沒有留下評論。

我嘗試使用以下內容:

SELECT first_name, last_name, COUNT(comment_id) 
from panelists 
INNER JOIN comments USING (panelist_id) 
WHERE project = x 

但我只得到了3名誰實際上已經給出了評語結果。有什麼建議麼?

+0

請始終提小組成員的所有項目總數的計數其你正在使用的數據庫。 SQL之間差別很大;例如,SQL Server有很多不可用的可能性(反之亦然)。 – 2011-04-13 21:36:18

+0

瞭解。感謝您的建議。 JL – 2011-04-14 17:07:25

回答

2

outer join是關鍵部分,我也覺得你在評論連接中忘記了項目。當您通過特定列進行計數時,不會計算空值。

select 
    pj.project_id, 
    p.panelist_id, 
    p.firstname, 
    p.lastname, 
    totalcomments = count(c.comment_id) 
from 
    project pj 
    inner join panelists_on_projects pop on pop.project_id = pj.project_id 
    inner join panelist p on p.panelist_id = pop.panelist_id 
    left outer join comments c on 
     c.panelist_id = p.panelist_id 
     and c.project_id = pj.project_id 
where 
    pj.title = 'X' 
group by 
    pj.project_id, 
    p.panelist_id, 
    p.firstname, 
    p.lastname 
+0

註釋連接的第二個條件不是必須的,因爲您已經將where子句中的標題優化限制爲一個項目。 – tgandrews 2011-04-13 21:48:15

+1

@tgandrews不正確。 where子句只在項目表中選擇正確的行,它不會在沒有第二個連接條件的情況下以任何方式過濾註釋。提問者不希望其他項目的評論被計算在內。 – 2011-04-13 21:51:32

+0

@Aleksi - 是的你是對的。我已經通過回答改變了和你的一樣正確。 – tgandrews 2011-04-13 21:54:32

0

這是我的實現。儘管如果你知道project_id,你可以直接進入panelists_on_projects表。

select 
    pan.first_name 
    , pan.last_name 
    , count(com.comment_id) 
from 
    projects proj 
    inner join panelists_on_project pop 
     on proj.panelist_id = pop.panelist_id 
    inner join panelist pan 
     on pop.panelist_id = pan.panelist_id 
    left outer join comments com 
     on pan.panelist_id = com.panelist_id 
     and com.project_id = proj.project_id 
where 
    proj.title = 'x' 
group by 
    pan.first_name 
    , pan.last_name 

不上的評論二號條件and com.project_id = proj.project_id參加這個會的意見對那名項目「X」

+0

謝謝tg。我很感謝你的幫助。 – 2011-04-13 22:28:58

0
SELECT P.first_name, P.last_name, COUNT(C.comment_id) 

FROM panelists as P 

LEFT JOIN panelists_on_projects AS PP ON PP.panelist_id = P.panelist_id 

LEFT JOIN projects AS PR PN PP.project_id = PR.project_id 

LEFT OUTER JOIN comments As C ON C.panelist_id = P.panelist_id AND C.project_id = PR.project_id 

WHERE PR.title = "x" 
+0

感謝SyntaxGoonoo – 2011-04-13 22:28:31