创建视图时,我可以缩短执行时间吗?我想优化执行时间,但显然我无法改变表格来添加索引。
另外,我可以使用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
答案 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
条件来执行此操作,(假设员工可以由pin
或empcode
唯一标识, )所有三个子查询都应该选择spmm_employee_info
中的相同的单个行。这意味着它们可以折叠为单个子查询,它返回所有三列。这给出了一个子查询,为父查询中的每一行返回一行;通过将子查询的WHERE
子句和AND
与父查询的子句一起使用,可以将其转换为简单的内连接。
此时我认为你(卡尔)应该通过它作为练习,让我知道我的解释是否有意义。我还鼓励你找一本关于使用SQL的好书,夜班或在线教程,因为MySQL文档描述如何使用这些工具,但在 时没有深入了解或为什么。