【问题标题】:Convert Subquery To Join For Use As View将子查询转换为联接以用作视图
【发布时间】:2015-11-26 00:29:32
【问题描述】:

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

另外,我可以使用 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

【问题讨论】:

  • 假设上面的查询产生了想要的结果,要让它变成一个视图,你只需将它包装在一个 CREATE VIEW 语句中,所以我猜这实际上不是你想要的问。
  • 实际上,如果我按照您所说的去做,它不会产生任何结果,因为它有子查询。我已经试过了
  • 啊哈!所以你真正想做的是把这个查询转换成JOIN。 (对此感到抱歉;我认为“无子查询”是 MySQL 特有的,我已经忘记了。)
  • 创建视图和优化执行时间是两件事。你想要哪个,或者你最想要哪个?
  • 我想优化执行时间,但显然我无法更改表以在其上添加索引。您认为我们在创建视图时可以缩短执行时间吗?另外,请帮助使用 JOIN 重写查询

标签: mysql join view subquery


【解决方案1】:

我现在正在查看我的解决方案并想,“我一定错过了什么!”其中三个子查询已经折叠成一个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 与父查询的子句一起转换为简单的内连接。

在这一点上,我认为您 (Karl) 应该将其作为练习来完成,如果我的解释有道理,请告诉我。我还鼓励您寻找一本关于使用 SQL 的好书、夜课或在线教程,因为 MySQL 文档描述了如何使用这些工具,但没有提供关于何时的见解或为什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2012-04-03
    • 2020-12-06
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多