mysql - 如何保证mysql中的行以特定方式显示

标签 mysql

我试图通过 id 获取每天的工作时间,该表有两列(id,registro):

id     registro
1      2017-08-23 08:00:00  -starting working day
1      2017-08-23 12:00:00  -stop for lunching time
2      2017-08-23 12:40:00  
1      2017-08-23 13:00:00  - return from lunching time
1      2017-08-23 17:00:00  - going home

然后我复制了这个想法:Get total hours worked in a day mysql为了创建一个列 in_out 并得到这个:

set @num := 0;
select tab.id, date_format(`registro`,'%d/%m/%Y') as date_,
SUM(UNIX_TIMESTAMP(`registro`)*(1-2*`in_out`))/3600 AS `hours_worked`
 from (select id, registro, mod(@num := @num+1,2) as in_out from registro_ponto_v
    where id= 1
    and date_format(registro,"%d-%m-%Y") = '23-08-2017'
    order by registro asc) as tab 
group by tab.id, date_;

当我在 (mysql 14.14 dist 5.7.16 (x86_64) 上执行时,它正确地结果 8hs,但是当我在 debian 9 上的服务器版本 10.1 上执行时,由于某种原因,in_out 列在子选择中不显示相同的行顺序...(8 小时 - 1;12 小时 - 0;13 小时 -1;17 小时 -0) 因此小时的总和会得到不同的值。那么我的观点是:有一种方法可以保证行的顺序与此匹配:

id    registro  in_out
1     8hs        1
1     12hs       0
1     13hs       1
1     17hs       0

最佳答案

我认为如果您能够显式存储“ins”和“outs”,这会更简单......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL
, registro DATETIME NOT NULL
,status ENUM('in','out') NOT NULL
,PRIMARY KEY(id,registro)
);

INSERT INTO my_table VALUES
(1,'2017-08-23 08:00:00','in'),
(1,'2017-08-23 12:00:00','out'),
(2,'2017-08-23 12:40:00','in'),
(1,'2017-08-23 13:00:00','in'),
(1,'2017-08-23 17:00:00','out');

SELECT id
     , DATE(user_in) date
     , SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(user_out,user_in)))) total 
  FROM
     ( SELECT x.id,x.registro user_in,MIN(y.registro) user_out 
         FROM my_table x 
         JOIN my_table y 
           ON y.id = x.id 
          AND y.registro > x.registro 
          AND y.status = 'out' 
        WHERE x.status = 'in' 
        GROUP 
           BY x.id, x.registro
     ) a
 GROUP 
    BY id,date;
+----+------------+----------+
| id | date       | total    |
+----+------------+----------+
|  1 | 2017-08-23 | 08:00:00 |
+----+------------+----------+

关于mysql - 如何保证mysql中的行以特定方式显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864766/

相关文章:

php - MySQL COUNT 显示它正在运行

mysql json 查询对 bool 值很有趣

MySQL 在同一个表上相交

MySQL如何处理错误: Subquery returns more than 1 row?

mysql - Symfony 原则 orderby 和 group by(不同)

java - 在哪里初始化连接池,java tomcat

php - gearman/php与mysql之间的连接池

mysql - 多个子查询,一个返回多于1行

java - 邮政编码列表 - MySql JSON 数组

mysql - 使用函数触发时出现错误 1064