在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;
1条答案
按热度按时间czq61nw11#
您的子查询合并令人困惑和错综复杂。为什么不干脆像this那样呢?
子查询的效率至少不比连接高,但通常效率较低,特别是在它们错综复杂的情况下,因为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
上为表建立索引。