如何将具有相同列值的两行合并为一行



我正在尝试使用Codeigniter 4和查询生成器获取数据。我有一个类似下面的表格结构

in_outtime在输出>在
id employee_id
1 EMP_00108:10
2 EMP_00110:30
3 EMP_00209:15

您可以通过将表attendance与其自身连接(左连接(来解决此问题。

inout是来自列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查询生成器类转换为CI查询。注意表别名t1t2以及列别名inout的使用

$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;

这是为了回答您的问题如何将具有相同列值的两行合并为一行您需要为几个考勤问题做好准备,如

  • 同一天同一员工多次办理入住/退房手续
  • 午夜后退房(第二天(
  • 员工忘记提前办理入住手续,想退房
  • 员工忘记提前退房,想办理入住手续

可能还有其他

最新更新