SQL排序记录基于多对多关系的条件

时间:2013-10-10 16:57:11

标签: mysql many-to-many sql-order-by

我无法编写SQL来根据多对多关系中的条件对记录进行排序。我有表结构tasks,有许多表用于任务依赖。例如。任务C可以通过表task_dependencies对其他任务具有一个或多个依赖关系。

  • TASKS:id,user_id,status_id,date_due,...
  • TASK_DEPENDENCIES:task_id,dependency_task_id(数据透视表)
  • 状态如下:Q-new,G-In progress,L-closed

具有任务依赖性的想法是,在关闭所有依赖任务之前,无法启动一个任务。我想选择所有用户的打开任务。这很简单。但是我需要通过date_due对它们进行排序,但是在结果集的末尾还有所有依赖项无法启动的任务。意思我需要以某种方式检查是否所有依赖任务都已关闭,并在排序时将其考虑在内?

我设法将一个选择放在一起,但这总是将所有具有依赖关系的任务放在记录集的末尾。但我想将具有封闭依赖关系的任务放在正常的date_due订单流程中......

SELECT 
   T.id, T.description, TD.dependency_task_id, 
   ISNULL(TD.dependency_task_id) AS NoDependency, T.date_due
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

这是SQL小提琴:http://sqlfiddle.com/#!2/894f7/3

1 个答案:

答案 0 :(得分:0)

试一试。它在select语句中使用OR来查看dependency_task_id is nullstatus = 'L'是否加入tasks表以查找该内容。

SELECT T.id, T.description, TD.dependency_task_id, 
  ISNULL(TD.dependency_task_id) OR t2.status_id = 'L'  AS NoDependency, 
  T.date_due
FROM tasks T 
  LEFT OUTER JOIN task_dependencies TD 
    ON T.id = TD.task_id 
  LEFT OUTER JOIN tasks t2 
    ON TD.dependency_task_id = T2.id 
WHERE T.assigned_user_id=1
ORDER BY NoDependency DESC, T.date_due
相关问题