我只是感到困惑。已经尝试搜索整个网站或谷歌,但没有找到“最近”的解决方案。
好吧,假设我有这个表结构。
id date finger_id finger_time is_enter
1 2017-03-30 2 09:00 1
2 2017-03-30 2 17:13 0
3 2017-03-31 4 09:10 1
4 2017-03-31 3 09:01 1
5. 2017-03-31 3 17:00 0
我想让表格像下面这样。
date finger_id enter_time exit_time
2017-03-30 2 09:00 17:13
2017-03-30 4 09:10
2017-03-31 3 09:10 17:00
我做了sql语句,结果变成这样
date finger_id enter_time exit_time
2017-03-30 2 09:00
2017-03-30 2 17:13
2017-03-31 4 09:10
2017-03-31 3 09:01
2017-03-31 3 17:00
我只想知道如何通过 finger_id 列在同一日期合并 is_enter 1 和 is_enter 0。
这是我的 sql 查询以供引用。
SELECT *
FROM `tbl_fingerprint`
LEFT JOIN `tbl_employee` ON `tbl_employee`.`fingerprint_id`=`tbl_fingerprint`.`fingerprint_id`
LEFT JOIN `tbl_position` ON `tbl_position`.`position_id`=`tbl_employee`.`position_id`
WHERE `fingerprint_date` >= '2017-03-01'
AND `fingerprint_date` <= '2017-04-01'
GROUP BY `tbl_fingerprint`.`fingerprint_id`,
`tbl_fingerprint`.`fingerprint_date`,
`tbl_fingerprint`.`is_enter`
ORDER BY `fingerprint_date` ASC LIMIT 30
感谢您的帮助。
最佳答案
你可以做一个 group by
date
和 finger_id
字段并使用条件表达式(case
或 if()
) 在聚合函数中以获得预期的结果。聚合函数中的条件语句确保只有在 is_enter
字段中设置了正确的值时它们才会返回值。我省略了员工详细信息,因为这些不构成您问题的一部分:
SELECT date, fingerprint_id, max(if(is_enter=1,finger_time,null) as enter_time, max(if(is_enter=0,finger_time,null) as exit_time
FROM `tbl_fingerprint`
WHERE `fingerprint_date` >= '2017-03-01'
AND `fingerprint_date` <= '2017-04-01'
GROUP BY `tbl_fingerprint`.`fingerprint_id`,
`tbl_fingerprint`.`fingerprint_date`,
ORDER BY `fingerprint_date` ASC LIMIT 30
关于Mysql查询将两个条件合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43179646/