我正在嘗試使用 Codeigniter 4 和查詢生成器獲取資料。我有一個如下表結構
| ID | 員工ID | 進出 | 時間 |
|---|---|---|---|
| 1 | EMP_001 | 在 | 08:10 |
| 2 | EMP_001 | 出去 | 10:30 |
| 3 | EMP_002 | 在 | 09:15 |
我想檢索資料并作為單個陣列輸出到視圖,將兩行記錄組合成一行,如下所示
| ID | 員工ID | 在 | 出去 |
|---|---|---|---|
| 1 | EMP_001 | 08:10 | 10:30 |
| 2 | EMP_002 | 09:15 |
我目前的型號如下
$builder = $this->db->table('attendance');
$builder->select('id, employee_id, in_out, time');
$builder->select('id, employee_id, in_out, CONCAT(DATE_FORMAT(time, "%r"), '.', DATE_FORMAT(time, "%r")) AS clock_time', FALSE);
$builder->groupBy('employee_id');
$query = $builder->get()->getResult();
return $query;
我想弄清楚使用CONCAT還是有更好的方法?
uj5u.com熱心網友回復:
你可以通過加入(左加入)你的表來解決這個問題attendance。
列in和out是列的別名time。第一個 SELECT 為您獲取in每個員工的所有值,根據您的示例,這些值始終具有值。
現在我們只需要添加out通過 LEFT JOIN 完成的部分,attendance再次查詢表。
這是原始的 MySQL 查詢,你可以在這個 sqlfiddle中看到它
SELECT
`t1`.`id`,
`t1`.`employee_id`,
`t1`.`time` AS `in`,
`t2`.`time` AS `out`
FROM
`attendance` `t1`
LEFT JOIN(
SELECT
*
FROM
`attendance`
WHERE
`in_out` = 'out'
) t2
ON
`t1`.`employee_id` = `t2`.`employee_id`
WHERE
`t1`.`in_out` = 'in'
這可以使用 CI Query Builder 類“翻譯”成 CI 查詢。注意表別名的使用以及列別名t1和t2inout
$builder = $this->db->table('attendance t1');
$builder->select('t1.id, t1.employee_id, t1.time as in, t2.time as out');
$builder->join('(SELECT * FROM attendance WHERE in_out = "out") t2', 't1.employee_id = t2.employee_id', 'left')
$builder->where(t1.in_out, 'in');
$query = $builder->get()->getResult();
return $query;
雖然這是為了回答您的問題如何將具有相同列值的兩行合并為一行,但您需要為幾個考勤問題做好準備,例如
- 同一員工在同一天多次辦理入住/退房
- 午夜后退房(第二天)
- 員工忘記提前入住,想退房
- 員工忘記提早退房,想入住
可能還有其他人
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523436.html
