基于条件的SQL排序记录在多对多关系中
问题描述:
我无法编写SQL来根据条件对记录进行多对多的关系排序。我有表结构tasks
与许多表的任务依赖关系。例如。任务C可以通过表task_dependencies
对其他任务有一个或多个依赖关系。基于条件的SQL排序记录在多对多关系中
- 任务:ID,USER_ID,STATUS_ID,date_due,...
- TASK_DEPENDENCIES:TASK_ID,dependency_task_id(透视表)
- 状态有以下:Q-新,G-在进步,L-关闭
带有任务依赖关系的想法是,一个任务只有在所有依赖关系任务都关闭之后才能启动。我想选择所有用户的打开任务。这很容易。但是我需要通过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。
答
试试看。它在select语句中使用OR
来查看dependency_task_id is null
或status = '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
看起来更好,但并不完美。问题是具有多个依赖关系的任务在结果集中多次列出...每个任务应该只在列表中一次!如果列表中依赖项之一仍然处于打开状态,则应在尚未准备好启动的任务之间的最后对其进行排序。 –
你可以在你的SQLfiddle中查找ID为811的任务,它会列出两次。试图找出如何解决这个问题。 –
@PrimozRome - 这项工作:http://sqlfiddle.com/#!2/894f7/9 – sgeddes