如何高效查询员工最近执行的任务?

fzsnzjdm  于 2022-10-03  发布在  Mysql
关注(0)|答案(1)|浏览(90)

在MySQL中,我需要从包含员工姓名、任务和时间戳的表中查询员工最近执行的三项任务。例如,对于员工Adam来说,最近的任务是归档、打字和清洁。

我当前的查询返回准确的结果,但如果我以最有效的方式编写了查询,我希望得到一些指导。任何建议都将不胜感激。

CREATE TABLE TempData ( Employee VARCHAR(16), Task VARCHAR(16), TaskDate DATE );

INSERT INTO TempData VALUES 
( 'Adam', 'Filing', '2022-09-30' ),
( 'Adam', 'Filing', '2022-09-29' ),
( 'Adam', 'Filing', '2022-09-28' ),
( 'Adam', 'Typing', '2022-09-28' ),
( 'Adam', 'Typing', '2022-09-27' ),
( 'Adam', 'Typing', '2022-09-26' ),
( 'Adam', 'Cleaning', '2022-09-25' ),
( 'Adam', 'Cooking', '2022-09-24' ),
( 'Adam', 'Organizing', '2022-09-23' ),
( 'Bob', 'Typing', '2022-09-27' ),
( 'Bob', 'Baking', '2022-09-25' );

SELECT Task, (  SELECT TaskDate 
                  FROM TempData 
                 WHERE Employee = 'Adam' AND TempData.Task = TaskList.Task 
              ORDER BY TaskDate DESC LIMIT 1 ) MostRecent
FROM ( SELECT DISTINCT Task FROM TempData WHERE Employee = 'Adam') TaskList
ORDER BY MostRecent DESC
LIMIT 3;
czq61nw1

czq61nw11#

您的子查询合并令人困惑和错综复杂。为什么不干脆像this那样呢?

select Task, max(TaskDate) as MostRecent from TempData 
where Employee = 'Adam'
group by Task 
order by MostRecent desc 
limit 3;

子查询的效率至少不比连接高,但通常效率较低,特别是在它们错综复杂的情况下,因为SQL引擎很难将它们优化回连接。考虑我们两个查询的explain select

Id|SELECT_TYPE|TABLE|Partitions|TYPE|Posable_Key|key|key_len|ref|row|Filted|Extra
|-|-|
1|主|<派生3>|Null|全部|Null|Null|2|100.00|使用临时;使用文件排序
3|派生|TempData|Null|全部|Null|Null|11|10.00|使用WHERE;使用临时
2|从属SUBQUERY|TempData|NULL|ALL|NULL|NULL|11|9.09|使用WHERE;使用文件排序

Id|SELECT_TYPE|TABLE|Partitions|TYPE|Posable_Key|key|key_len|ref|row|Filted|Extra
|-|-|
|1|Simple|TempData|NULL|ALL|NULL|NULL|11|10.00|使用WHERE;使用临时;使用文件排序

如果您希望它更高效,您可以在Employee上为表建立索引。

相关问题