Mysql 查询中的计数、求和、左联接和分组依据无法正常工作
我尝试了一些方法,但似乎无法找出问题的原因。 当我删除totalHours部分时,查询工作正常。但有了它,它会显示正确的小时数,但显示错误的工作数量、选定的工作和获奖者 有人能告诉我我做错了什么吗 提前谢谢 这是我的疑问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.
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