繁体   English   中英

创建自联接查询

[英]Create self join query

我正在尝试建立考勤系统。 签入和签出表的设计如下

id
loginout (datetime) 
log_type[enum('I','O')]
fk_created_id

例如记录

现在,我要在两个单独的字段中签入和签出,以便可以计算出时间差或一天中的总时数。

7   2014/07-31 06:00:32  I 1
8   2014/07-31 09:10:32  O 1
9   2014/07-31 09:30:32  I 1
10 2014/07-31 12:00:32   O 1

我正在尝试创建自联接查询,但是在这里我不知道将要比较哪个两个字段。如何为此进行自联接查询?在这种类型的查询中,如何知道将要比较哪个字段?

检查了这一点,如果能帮助你

考虑一个久经考验的例子:员工和经理。 这是数据库中的人员表

mysql> select * from staff;
+----+------------+-----------+------------+
| id | first_name | last_name | manager_id |
+----+------------+-----------+------------+
|  1 | Hattie     | Hopkins   |          4 |
|  2 | Henry      | Hopkins   |          4 |
|  3 | Harry      | Hopkins   |          5 |
|  4 | Helen      | Hopkins   |       NULL |
|  5 | Heidi      | Hopkins   |          4 |
|  6 | Hazel      | Hopkins   |          1 |
+----+------------+-----------+------------+
6 rows in set (0.00 sec)

为了查看谁向谁报告,我们需要查询表以获取员工,并再次获取经理的姓名。

mysql> select e.first_name as employee, m.first_name as reports_to
    -> from staff e
    -> inner join staff m on e.manager_id = m.id;
+----------+------------+
| employee | reports_to |
+----------+------------+
| Hattie   | Helen      |
| Henry    | Helen      |
| Harry    | Heidi      |
| Heidi    | Helen      |
| Hazel    | Hattie     |
+----------+------------+
5 rows in set (0.02 sec)

如果数据中的所有内容都正确,例如outs = ins,则查询非常简单

select s1.*,s1.o-s2.i from 
  (select sum(loginout) o from t1 where log_type="O" and date(loginout)='2014-07-31') s1,
  (select sum(loginout) i from t1 where log_type="I" and date(loginout)='2014-07-31') s2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM