2013-06-25 106 views
2

感謝advnace閱讀此內容。我不太擅長SQL,所以請原諒任何愚蠢的錯誤...SQL查詢和COUNT的困難

這是交易,我有四個表(我只打算給基本領域,和表之間的依賴關係,爲了的簡單性):

  1. 公司:companyId,公司名稱
  2. 用戶:用戶id,用戶名
  3. 項目:專案編號,projectUserId,projectCompanyId,projectDate
  4. 研究:studyProjectId

的依賴就像這樣:

  • 項目是爲客戶(projectUserId),並通過公司開展(projectCompanyId)
  • 有沒有可以在同一個項目很多研究,但每個研究對於一個項目(studyProjectId)

這裏是我想寫的要求的那種,但它目前不工作:

SELECT 
    project.projectId, 
    company.companyName, 
    user.userName, 
    COUNT(study.studyId) AS numberStudies 
FROM project, company, user, study 
WHERE company.companyId = project.projectCompanyId, 
AND user.userId = project.projectUserId, 
AND study.studyProjectId = project.projectId 
ORDER BY company.companyId, user.userId, project.projectDate; 

它返回一個numberStudies等於研究總數的記錄。如果我從SELECT刪除COUNT,然後我得到的結果我想要的類型,但沒有列numberStudies(當然)。希望你明白我想要得到什麼,我在這裏做錯了什麼?再次

感謝提前:)

編輯:如果可能的話,我想顯示記錄,即使numberStudies爲0

+5

添加'GROUP BY company.companyName,user.userId,project.projectId'了'WHERE'之後,'ORDER BY'之前。 –

+0

@ypercube好的,現在真是太棒了! :)你能解釋我爲什麼我需要'GROUP BY',我真的想明白我的錯誤。 – Sheljohn

+2

@ Sh3ljohn計數是一個聚合函數。它們通常只在通過一些(或全部)列進行分組時才與其他列一起工作。請閱讀:[MySQL Aggregate Functions](http://www.mysqltutorial.org/mysql-aggregate-functions.aspx)。 – Marian

回答

2

正如評論中所述,如果您想要獲得彙總結果(例如:「每個項目,公司和用戶的研究數量」),您需要一個GROUP BY條款。所以,要做的第一件事情就是添加:

GROUP BY project.projectId, company.companyName, user.userName 

注意,三列正好三個,你必須在SELECT列表(非聚集的)。

SELECT 
    project.projectId, 
    company.companyName, 
    user.userName, 
    COUNT(study.studyId) AS numberStudies 
FROM project, company, user, study 
WHERE company.companyId = project.projectCompanyId, 
    AND user.userId = project.projectUserId, 
    AND study.studyProjectId = project.projectId 
GROUP BY project.projectId, company.companyName, user.userName 
ORDER BY company.companyId, user.userId, project.projectDate ; 

這將顯示你想要什麼,但仍存在一些問題:

  • 首先,您使用的是隱舊的(SQL-89)語法與WHERE子句中的條件下加入。此語法不被棄用,但帶有JOIN關鍵字的新(好,20年SQL-92)語法有幾個優點。
  • 我們可以爲表的可讀性添加別名。
  • 可能有兩個公司或用戶名相同,所以我們應該按他們的ID進行分組,而不僅僅是他們的姓名。
  • 明確的JOIN語法的一個優點是,當沒有要加入的行時可以很容易地得到結果(因爲您希望在沒有項目研究時顯示)。只是LEFT JOINstudy表。

因此,查詢變爲:

SELECT 
     p.projectId, 
     c.companyName, 
     u.userName, 
     COUNT(s.studyId) AS numberStudies 
    FROM 
     project AS p 
     JOIN 
     company AS c ON c.companyId = p.projectCompanyId 
     JOIN 
     user AS u  ON u.userId = p.projectUserId 
     LEFT JOIN 
     study AS s ON s.studyProjectId = p.projectId 
    GROUP BY 
     c.companyId, 
     u.userId, 
     p.projectId, 
     c.companyName, u.userName 
    ORDER BY 
     c.companyId, 
     u.userId, 
     p.projectDate ; 
+0

非常感謝這些清晰的解釋和解決方案! :) – Sheljohn

+0

你爲什麼按公司名稱和用戶名分組? – Sheljohn

+2

因爲你正在'SELECT'列表中顯示它們。 –

0

你可能需要一個LEFT研究和項目之間的連接請求

+0

是的,其實這就是我在網上挖掘的東西(至少有一種方法),但我無法正確理解這個請求。 – Sheljohn