Mysql查询将两个条件合并为一行

标签 mysql sql

我只是感到困惑。已经尝试搜索整个网站或谷歌,但没有找到“最近”的解决方案。

好吧,假设我有这个表结构。

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 datefinger_id 字段并使用条件表达式(caseif()) 在聚合函数中以获得预期的结果。聚合函数中的条件语句确保只有在 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/

相关文章:

mysql - 使用 Zend Framework 和 PDO Adapter 加载数据本地 Infile

c++ - SQLite 转义字符串 C++

mysql - 如何连接多个表,确保将较小的表扩展到较大的表

c# - 调用多个存储过程最快的代码是什么?

mysql - 如何使用 ORDER BY RAND() 将同一张表与自身连接起来?

php - 只读mysql数据库

Mysql: #1064 存储过程错误

sql - 从值表计算算术返回

MySQL PDO - 通过联接分组的表的最新行

Mysql - 从 unix 时间戳中选择年份