如何查询员工详细信息并关联其绩效指标?

问题描述 投票:2回答:2

我正在获取所有已批准但未存档的员工的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看起来像这样:

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是表tbl_employee的ID

2)库表中的lead_id是表c_idtbl_lead

3] f_bankid中的tbl_fileStatus是表bank_idtbl_bankdata

php sql codeigniter join multidimensional-array
2个回答
0
投票

如果第二个查询取决于第一个结果,为什么不对第一个查询使用join语句?或者尝试像这样插入新对象:

$queryEmp = "SELECT e.id, e.firstname, e.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) {
    $query2     = "";// another sql query here
    $getQuery2  = $this->db->query($query2);
    $result2    = $getQuery2->result();

    $prop = 'somename';
    $result->{$key}->{$prop} = new stdClass;
    $result->{$key}->{$prop} = $result2;
}


print_r($result);

假设第二个查询已经包含fallowCallconfirmCount对象。


0
投票

实际上,仅保存计数数据就无需创建其他深度/复杂度。此外,通过结合使用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

这里是数据库小提琴演示,其中对您提供的示例数据进行了一些调整: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
}
© www.soinside.com 2019 - 2024. All rights reserved.