创建自联接查询

时间:2014-08-01 05:30:50

标签: mysql sql self-join

我正在尝试制作考勤系统。办理入住和退房手续表如下设计

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

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

2 个答案:

答案 0 :(得分:0)

如果this可以帮助您

,请查看此信息

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

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)

答案 1 :(得分:0)

如果数据中的所有内容都是正确的,例如如果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