转换子查询以加入以用作视图

时间:2015-11-26 00:29:33

标签: mysql join view subquery

创建视图时,我可以缩短执行时间吗?我想优化执行时间,但显然我无法改变表格来添加索引。

另外,我可以使用JOIN重写此查询吗?

我想优化执行查询的时间。

 select
   Empcode
 , Name
 , Department
 , in_datetime
 , out_datetime
 , date_format(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,in_datetime,out_datetime)),'%H:%i:%S') as duration
 from (
  select
        (select Empcode from spmm_employee_info c where logs_spmm.Pin=c.Empcode or logs_spmm.pin=c.Pin) as Empcode, (select Name from spmm_employee_info e where logs_spmm.pin=e.Empcode or logs_spmm.pin=e.Pin) as Name
   ,(select Department from spmm_employee_info e where logs_spmm.pin=e.Empcode) as Department
      , date_time as in_datetime
      , (select s.Date_time from logs_spmm as s 
     where s.Date_time>logs_spmm.Date_time and s.Mode='OUT' and s.Pin=logs_spmm.Pin limit 1) as out_datetime
  from logs_spmm
  where mode = 'IN' 
) as relog

1 个答案:

答案 0 :(得分:0)

我现在正在寻找我的解决方案并且在想,“我一定错过了什么!”其中三个子查询已折叠为单个INNER JOIN,如果我对数据有更多了解,则最后一个子查询可能会崩溃,也可能不会崩溃;如果确实如此,那么外部SELECT也可能会消失。

正如SwiftArchitect正确地指出的那样,这不是代码编写服务,所以我会尝试分享我使用的逻辑。

有问题的三个子查询,

...
(select Empcode from spmm_employee_info c
    where logs_spmm.Pin=c.Empcode or logs_spmm.pin=c.Pin)
  as Empcode,
(select Name from spmm_employee_info e
    where logs_spmm.pin=e.Empcode or logs_spmm.pin=e.Pin)
  as Name,
(select Department from spmm_employee_info e
    where logs_spmm.pin=e.Empcode)
  as Department
...

正在从同一个表中选择三个不同的列,并使用相同的WHERE条件来执行此操作,(假设员工可以由pinempcode唯一标识, )所有三个子查询都应该选择spmm_employee_info中的相同的单个行。这意味着它们可以折叠为单个子查询,它返回所有三列。这给出了一个子查询,为父查询中的每一行返回一行;通过将子查询的WHERE子句和AND与父查询的子句一起使用,可以将其转换为简单的内连接。

此时我认为你(卡尔)应该通过它作为练习,让我知道我的解释是否有意义。我还鼓励你找一本关于使用SQL的好书,夜班或在线教程,因为MySQL文档描述如何使用这些工具,但在 时没有深入了解为什么。