我正在获取所有已批准但未存档的员工的ID,名字和姓氏。然后,我循环这些结果,并使用ID查询其他表以收集一些计数数据。
我尝试了下面的代码,但没有得到预期的输出。
$queryEmp = " SELECT id, firstname, lastname FROM tbl_employee as e WHERE is_archive=0 and is_approved=1 "; $getQuery= $this->db->query($queryEmp); $result= $getQuery->result(); foreach ($result as $key=> $value) { //echo "<pre>"; print_r($value); $day = "MONTH(date_of_created) = DATE(CURRENT_DATE())"; $group = "f_id IN (SELECT MAX(f_id) FROM tbl_fileStatus GROUP BY f_bankid)"; $condiion = "and ba.createdby='" . $value->id . "' and " . $day ." and " . $group; $query2 = " select (SELECT COUNT(c_id) FROM tbl_lead WHERE leadstatus='1' AND ".$day.") as confirmCount, (SELECT COUNT(f_id) FROM tbl_fileStatus as fs join tbl_bankdata as ba on ba.bank_id=fs.f_bankid WHERE fs.f_filestatus=1 " . $condiion . ") as disbursed, (SELECT COUNT(f_id) FROM tbl_fileStatus as fs join tbl_bankdata as ba on ba.bank_id=fs.f_bankid WHERE fs.f_filestatus=2 ".$condiion.") as filesubmit "; # code... $getQuery2= $this->db->query($query2); $result2[]=$getQuery2->result(); } echo "<pre>"; print_r(result2);
$result 看起来像这样:
$result
Array ( [0] => stdClass Object ( [id] => 1 [firstname] => xyz [lastname] => xyz ) ... )
第二个查询输出:
Array ( [0] => Array ( [0] => stdClass Object ( [fallowCall] => 0 [confirmCount] => 0 [disbursed] => 0 [filesubmit] => 0 ) ) ... )
如何产生正确的结果,将各个员工与其绩效指标联系起来?该结构之一:
Array ( [0] => stdClass Object ( [id] => 1 [firstname] => xyz [lastname] => xyz [somename] => ( [fallowCall] => 0 [confirmCount] => 0 [disbursed] => 0 [filesubmit] => 0 ) ) ... )
或这种结构:
Array ( [0] => stdClass Object ( [id] => 1 [firstname] => xyz [lastname] => xyz [fallowCall] => 0 [confirmCount] => 0 [disbursed] => 0 [filesubmit] => 0 ) ... )
我在这里添加了我的表结构和一些示例数据:https : //www.db- fiddle.com/f/8MoWmKPuzTrrC3DQJsiX35/0
一些注意事项
1)createdby是表的IDtbl_employee
createdby
tbl_employee
2)lead_id在bank表中是c_id该表的tbl_lead
lead_id
c_id
tbl_lead
3)f_bankid在tbl_fileStatus是bank_id表中的tbl_bankdata
f_bankid
tbl_fileStatus
bank_id
tbl_bankdata
实际上,不必为了保存计数数据而创建其他深度/复杂度。此外,通过结合使用LEFT JOIN来连接相关表并应用所需的条件规则,只需访问数据库一次即可达到所需的结果。毫无疑问,这将为您的应用程序提供卓越的效率。左联接非常重要,因此计数可以为零而不会从结果集中排除员工。
另外,我应该指出,您尝试查询的结果是错误地将一个MONTH()值与一个DATE()值进行比较- 永远都不会结束。:)实际上,为了确保您的sql能够准确地将当前月份与当前年份隔离开来,您还需要检查YEAR值。
MONTH()
DATE()
我推荐的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()因此使用一条语句。这样做与COUNT()(对每个符合条件的事件加1)相同,但不同之处COUNT()在于,除非IF()满足表达式,否则它不对特定行(在集群范围内)进行计数。 再举一个例子。
SUM(IF())
fileStatus
COUNT(fileStatus.f_filestatus)
f_filestatus = 1
f_filestatus = 2
IF()
COUNT()
这是一个db fiddle演示,其中对您提供的示例数据进行了一些调整:https : //www.db- fiddle.com/f/8MoWmKPuzTrrC3DQJsiX35/4 (结果集将是“好”,而当前是今年6月) )
将上面的字符串另存为后$sql,您可以简单地执行它并遍历对象数组,如下所示:
$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 }