0

我需要根据条件查询和排序记录。我有桌子:

  • TASKS (id, date_due, created_at, ...)
  • TASK_DEPENDENCIES (task_id, dependency_task_id),多对多关系表,其中dependency task_id 和dependency_task_id 是对TASKS 表的FK。

通常我会查询任务并按date_due. 但由于我们有任务依赖关系,我想这样订购:

  • 第一个没有依存关系的任务按 date_due 排序
  • 具有按 date_due 排序的依赖项的下一个任务

我现在的解决方案是我只需创建 2 个单独的查询并将其提供给表。这可以只用一个查询来完成吗?效率如何(快)?

更新:我现有的 SQL

非依赖任务

SELECT T.id, TD.dependency_task_id FROM tasks T 
LEFT OUTER JOIN task_dependencies TD ON T.id = TD.task_id 
WHERE assigned_user_id=1 AND TD.dependency_task_id IS null
ORDER BY T.date_due

依赖任务:

SELECT T.id, TD.dependency_task_id FROM tasks T 
LEFT OUTER JOIN task_dependencies TD ON T.id = TD.task_id 
WHERE assigned_user_id=1 AND TD.dependency_task_id IS NOT null
ORDER BY T.date_due
4

2 回答 2

1

您可以在 ORDER BY 子句中使用表达式。假设您有一个连接,您在其中将 TASK_DEPENDENCIES 表命名为“DEP”。在您的 ORDER BY 子句中,使用如下内容:

ORDER BY IF(DEP.task_id IS NULL, 0, 1), date_due

这将首先排序所有没有依赖关系的任务(按 date_due 排序),然后排序有依赖关系的任务(也按 date_due 排序)。

于 2013-10-10T12:46:08.977 回答
0

没有理由有两个查询。LEFT JOIN 负责处理任一场景。您只需要根据 NULL 值进行排序的另一列

SELECT T.id, TD.dependency_task_id, ISNULL(TD.dependency_task_id) AS NoDependency, T.datedue
FROM tasks T 
LEFT OUTER JOIN task_dependencies TD 
  ON T.id = TD.task_id 
WHERE assigned_user_id=1
ORDER BY NoDependency DESC, T.date_due

性能应该快两倍,因为它只是查询的一半

于 2013-10-10T13:12:50.453 回答