1 回答
TA贡献1829条经验 获得超6个赞
实际上不需要创建额外的深度/复杂性来保存计数数据。此外,通过使用 LEFT JOIN 的组合来连接相关表并应用所需的条件规则,您只需访问数据库一次即可获得所需的结果。毫无疑问,这将为您的应用程序提供卓越的效率。LEFT JOIN 使用起来很重要,这样计数可以为零,而不会将员工排除在结果集中。
另外,我应该指出,您尝试的查询错误地将一个MONTH()值与一个DATE()值进行了比较——这永远不会有好结果。:) 事实上,为了确保您的 sql 准确地将当前月份与当前年份分开,您还需要检查 YEAR 值。
我推荐的sql:
SELECT
employees.id,
employees.firstname,
employees.lastname,
COUNT(DISTINCT leads.c_id) AS leadsThisMonth,
SUM(IF(fileStatus.f_filestatus = 1, 1, 0)) AS disbursedThisMonth,
SUM(IF(fileStatus.f_filestatus = 2, 1, 0)) AS filesubmitThisMonth
FROM tbl_employee AS employees
LEFT JOIN tbl_lead AS leads
ON employees.id = leads.createdby
AND leadstatus = 1
AND MONTH(leads.date_of_created) = MONTH(CURRENT_DATE())
AND YEAR(leads.date_of_created) = YEAR(CURRENT_DATE())
LEFT JOIN tbl_bankdata AS bankData
ON employees.id = bankData.createdby
LEFT JOIN tbl_fileStatus AS fileStatus
ON bankData.bank_id = fileStatus.f_bankid
AND MONTH(fileStatus.date_of_created) = MONTH(CURRENT_DATE())
AND YEAR(fileStatus.date_of_created) = YEAR(CURRENT_DATE())
AND fileStatus.f_id = (
SELECT MAX(subFileStatus.f_id)
FROM tbl_fileStatus AS subFileStatus
WHERE subFileStatus.f_bankid = bankData.bank_id
GROUP BY subFileStatus.f_bankid
)
WHERE employees.is_archive = 0
AND employees.is_approved = 1
GROUP BY employees.id, employees.firstname, employees.lastname
该SUM(IF())表达式是一种用于执行“条件计数”的技术。“聚合数据”是通过使用 GROUP BY 形成的,并且必须使用专门的“聚合函数”从这些集群/非平面数据集合中创建线性/平面数据。 fileStatus由于 GROUP BY 调用,数据有效地堆积在自身上。如果COUNT(fileStatus.f_filestatus)被调用,它将计算集群中的所有行。由于您希望区分f_filestatus = 1和f_filestatus = 2,IF()因此使用了一个语句。这与(为每个符合条件的出现加 1)做同样的事情COUNT(),但它的不同之处在于COUNT()它不计算特定行(在集群范围内)除非表达式IF()被满足。 另一个例子。
这是一个 db fiddle 演示,对您提供的样本数据进行了一些调整:https://www.db-fiddle.com/f/8MoWmKPuzTrrC3DQJsiX35/4 (结果集只会是“好”,而当前是今年 6 月.)
将上述字符串保存为 后$sql,您可以简单地执行它并循环遍历对象数组,如下所示:
foreach ($this->db->query($sql)->result() as $object) {
// these are the properties available in each object
// $object->id
// $object->firstname
// $object->lastname
// $object->leadsThisMonth
// $object->disbursedThisMonth
// $object->filesubmitThisMonth
}
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报