mysql - SQL根据多对多关系中的条件对记录进行排序

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

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

  • 任务: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 fiddle :http://sqlfiddle.com/#!2/894f7/3 .

最佳答案

试一试。它在 select 语句中使用 OR 来查看 dependency_task_id 是否为 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

关于mysql - SQL根据多对多关系中的条件对记录进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301802/

相关文章:

mysql - 如何选择过去 30 天的数据并包含空行

python - Django get() 返回了不止一个

many-to-many - datomic 中的限定关系

mysql - 在 SQL 中存储数据的正确方法

MySQL查询从三个表中获取总计

javascript - 在循环中获取值,发送到另一个页面并使用该值调用捕获数据

java - 使用 Java 的 Google App Engine 中的多对多关系

mysql - 分页sql查询语法

sql - 结果类似于 SQL Server 2016 中的 Oracle 查询

PHP MYSQL QUERY ORDER BY desc问题