Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询中的计数、求和、左联接和分组依据无法正常工作_Mysql_Count_Group By_Sum_Left Join - Fatal编程技术网

Mysql 查询中的计数、求和、左联接和分组依据无法正常工作

Mysql 查询中的计数、求和、左联接和分组依据无法正常工作,mysql,count,group-by,sum,left-join,Mysql,Count,Group By,Sum,Left Join,我尝试了一些方法,但似乎无法找出问题的原因。 当我删除totalHours部分时,查询工作正常。但有了它,它会显示正确的小时数,但显示错误的工作数量、选定的工作和获奖者 有人能告诉我我做错了什么吗 提前谢谢 这是我的疑问 SELECT crmCandidate.candidateID, crmCandidate.candidateName, COUNT(DISTINCT crmJoin.joinID) AS Jobs, SUM(IF(crmJoin.

我尝试了一些方法,但似乎无法找出问题的原因。 当我删除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

最好的做法是在进行联接之前聚合数据。但是,我不太清楚您的表是如何构造的。您可能可以使用以下countdistinct子句执行您想要的操作:

可能有更有效的方法来做你想做的事情。但是,如果没有样本数据,表之间的关系很难理解。将来,当你问问题时,样本数据很好;SQL Fiddle上的一个例子甚至更好。

试试这个:

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

crmhours表联接丢失,样本数据和预期结果也会有帮助对不起,你说得对,我已更新了查询。
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