Mysql 如何使用5个子查询优化此查询?

Mysql 如何使用5个子查询优化此查询?,mysql,optimization,Mysql,Optimization,我基本上是在尝试优化这个查询,以便在将它合并到我的基础SELECT*FROM projectsquery之前,计算给定项目的任务小时数 其中1个子查询仅从任务表中进行选择,其中2个子查询从任务中进行选择,并在任务日志上进行内部联接,反之亦然,其中2个子查询彼此之间进行简单计算 有没有更有效的方法来优化这一点?我从未使用过临时表,但也许我可以先从tasks中选择具有给定项目id的所有任务,然后再从该临时表中进行后续选择?如有任何建议,我将不胜感激 如果需要,我可以使用sql FIDLE复制模式,但

我基本上是在尝试优化这个查询,以便在将它合并到我的基础
SELECT*FROM projects
query之前,计算给定项目的任务小时数

其中1个子查询仅从
任务
表中进行选择,其中2个子查询从
任务
中进行选择,并在
任务日志
上进行内部联接,反之亦然,其中2个子查询彼此之间进行简单计算

有没有更有效的方法来优化这一点?我从未使用过临时表,但也许我可以先从
tasks
中选择具有给定项目id的所有任务,然后再从该临时表中进行后续选择?如有任何建议,我将不胜感激


如果需要,我可以使用sql FIDLE复制模式,但这需要一些时间。

您可以多次从同一个表传递。如果没有任何执行计划,我会先尝试以下方法

SELECT
  (SELECT COALESCE(SUM(t.hours), 0) AS allotted_hours
   FROM tasks AS t
   WHERE t.projects_id = 8
     AND t.complete != 100
     AND t.name LIKE '%Ongoing%'
     AND t.name NOT LIKE '%Placeholder%') AS allotted_hours_notcomplete_ongoing,

  (SELECT COALESCE(SUM(tl.hours), 0) AS hr
   FROM tasks AS t
   INNER JOIN tasklogs AS tl ON (tl.tasks_id = t.id)
   WHERE t.projects_id = 8
     AND t.complete != 100
     AND t.name LIKE '%Ongoing%'
     AND t.name NOT LIKE '%Placeholder%') AS logged_hours_notcomplete_ongoing,

  (SELECT (allotted_hours_notcomplete_ongoing - logged_hours_notcomplete_ongoing) + logged_hours_notcomplete_ongoing) AS difference_notcomplete_ongoing,

  (SELECT COALESCE(SUM(t.hours), 0) AS hr
   FROM tasks AS t
   WHERE t.projects_id = 8
     AND t.complete != 100
     AND t.name NOT LIKE '%Ongoing%'
     AND t.name NOT LIKE 'Placeholder%') AS allotted_hours_notcomplete_regular,

  (SELECT COALESCE(SUM(tl.hours), 0) AS hr
   FROM tasklogs AS tl
   INNER JOIN tasks AS t ON (t.id = tl.tasks_id
                             AND t.projects_id = 8
                             AND t.complete = 100)
   WHERE hourtypes_id IN (1,
                          2)) AS logged_hours_complete,

  (SELECT logged_hours_complete + allotted_hours_notcomplete_regular + difference_notcomplete_ongoing) AS total
我基本上只试过一次。之后,我将使用内部选择和where进行过滤。您当然需要以下索引

任务

任务日志

t.id
t.projects_id
t.complete
t.name
hourtypes_id
t.hours
我假设hourtypes\u id在tasks表中

t.id
t.projects_id
t.complete
t.name
hourtypes_id
t.hours
tl.tasks_id
tl.hours