我尝试过一些事情,但我似乎无法弄清楚是什么导致了这个问题。 当我删除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
答案 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