查询中的Count,SUM,LEFT JOIN和GROUP BY无法正常工作

时间:2014-10-27 15:16:21

标签: mysql count group-by sum left-join

我尝试过一些事情,但我似乎无法弄清楚是什么导致了这个问题。 当我删除totalHours部分时,查询工作正常。但有了它,它会显示正确的小时数,但错误的工作,选定和赢家数量。

有人可以告诉我我做错了吗?

提前致谢。

这是我的查询;

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

2 个答案:

答案 0 :(得分: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的一个例子甚至更好。

答案 1 :(得分: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