【发布时间】:2014-11-20 19:09:40
【问题描述】:
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
我基本上是在尝试优化此查询,以便在将其合并到我的基本 SELECT * FROM projects 查询之前计算给定项目的任务小时数。
这些子查询中的 1 个仅从 tasks 表中选择,其中 2 个从 tasks 和 tasklogs 上的 INNER JOIN 中选择,反之亦然,其中 2 个是相互简单的计算。
有没有更有效的优化方法?我从来没有使用过临时表,但也许我可以先从 tasks 中选择具有给定项目 ID 的所有任务,然后从该临时表中执行我以后的 SELECT 操作?不胜感激。
如果需要,我可以使用 sql fiddle 复制架构,但这需要一些时间。
【问题讨论】:
标签: mysql optimization