我需要根据条件查询和排序记录。我有桌子:
TASKS (id, date_due, created_at, ...)
和TASK_DEPENDENCIES (task_id, dependency_task_id)
,多对多关系表,其中依赖关系task_id和dependency_task_id是FK到TASKS表。 通常我会查询任务并按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
Depencecy任务:
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
答案 0 :(得分:1)
您可以在ORDER BY子句中使用表达式。假设您有一个连接,您可以使用名称“DEP”对TASK_DEPENDENCIES表进行别名。在ORDER BY子句中,使用以下内容:
ORDER BY IF(DEP.task_id IS NULL, 0, 1), date_due
这将首先排序所有没有依赖关系的任务(by date_due),然后排序依赖关系的任务(也是date_due)。
答案 1 :(得分: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
性能应该快几倍,因为它只是查询的一半