2014-10-27 85 views
0

我已經嘗試了一些東西,但我似乎無法弄清楚是什麼導致了這個問題。 當我刪除totalHours部分時,查詢工作正常。但是有了它,它顯示了正確的小時數,但卻顯示了錯誤的Jobs,Selected和Winners的數量。計數,SUM,LEFT JOIN和GROUP BY在查詢不能正常工作

有人能告訴我我做錯了什麼嗎?

在此先感謝。

這是我的查詢;

SELECT 

    crmCandidate.candidateID, 
    crmCandidate.candidateName, 

    COUNT(DISTINCT crmJoin.joinID) AS Jobs, 

    SUM(IF(crmJoin.joinExtra = 'select', 1, 0)) AS Selected, 
    SUM(IF(crmJoin.joinExtra = 'winner', 1, 0)) AS Winner, 

    ROUND(SUM(crmDays.total)) AS totalDays 

FROM crmCandidate 
LEFT JOIN crmJoin ON (crmJoin.joinChild = crmCandidate.candidateID) 
LEFT JOIN crmJob ON (crmJob.jobID = crmJoin.joinParent) 
LEFT JOIN crmDays ON (crmDays.dayCandidateID = crmJoin.joinChild) 

WHERE 

    crmDays.dayJobID = crmJob.jobID AND 
    crmDays.dayCandidateID = crmCandidate.candidateID 

GROUP BY 
    crmCandidate.candidateID 

ORDER BY DESC 

LIMIT 100 
+0

crmhours表連接丟失,也樣本數據和預期的結果將有助於 – radar 2014-10-27 15:38:21

+0

對不起,你說得對,我已經更新了我的查詢。 – Fred 2014-10-27 15:43:06

回答

0

試試這個:

SELECT 
    crmCandidate.candidateID, 
    crmCandidate.candidateName, 
    COUNT(DISTINCT crmJoin.joinID) AS Jobs, 
    Sum(Case When crmJoin.joinExtra = 'select' Then 1 else 0 end) as Selected, 
    Sum(Case When crmJoin.joinExtra = 'winner' Then 1 else 0 end) as winner, 
    ROUND(SUM(crmDays.total)) AS totalDays 
FROM crmCandidate 
LEFT JOIN crmJoin 
    ON crmJoin.joinChild = crmCandidate.candidateID 
LEFT JOIN crmJob  
    ON crmJob.jobID = crmJoin.joinParent 
Inner JOIN crmDays 
    On crmDays.dayCandidateID = crmCandidate.candidateID 
    AND crmDays.dayJobID  = crmJob.jobID 
GROUP BY crmCandidate.candidateID, crmCandidate.candidateName 
ORDER BY candidateID DESC 
LIMIT 100 
0

做的最好的事情就是聚合數據,你做join之前。但是,我不太清楚你的表是如何構建的。你也許可以做你想做的有以下count(distinct)條款:

COUNT(DISTINCT case when crmJoin.joinExtra = 'select' then crmJoin.JoinId end) AS Selected, 
    COUNT(DISTINCT case when crmJoin.joinExtra = 'winner' then crmJoin.JoinId end) AS Winner, 

可能有更有效的方式做你想做的。但是,沒有樣本數據,表格之間的關係很難遵循。將來,當你提出問題時,樣本數據很好; SQL Fiddle上的一個例子甚至更好。