基于条件的MySQL排序

时间:2013-10-10 12:42:24

标签: mysql sql sql-order-by

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

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

通常我会查询任务并按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

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

2 个答案:

答案 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

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