1

我有一个表,其中包含一个进程要执行的任务列表。每个任务只对与输入状态匹配的项目起作用,当任务完成时,它会将项目的状态更改为输出状态。

为了跟踪这些任务,我使用了这样的表格。

CREATE TABLE `tasks` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(80) NOT NULL,
  `job_type` varchar(45) NOT NULL,
  `input_status` varchar(45) DEFAULT NULL,
  `output_status` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

任务的状态形成一个事件链。这是一个例子

NULL -> NEW
NEW -> CREATE
CREATE -> INSPECT
INSPECT -> VERIFY
VERIFY -> PUBLISH

在现实生活中,任务列表很长。注意:我不知道不同状态的类型,这些用户定义的值

当我使用input_status记录顺序查看表时,会以错误的顺序显示任务。排序input_status并且output_status也不起作用(显然)。

如何对首先排序的表进行排序,然后是tonull的链?input_statusoutput_status

我认为我必须创建一个虚拟字段来保存额外的排序值,但我不确定它应该是什么或计算出来的。

这是我到目前为止尝试过的,但它不起作用。

SELECT *,
    (SELECT input_status FROM tasks AS parent 
        WHERE parent.output_status = tasks.input_status
    ) AS sorted
    FROM tasks
    ORDER BY sorted, input_status;
4

3 回答 3

0

您可以构建一个应用排序的 case 语句(但不确定确切的语法):

SELECT * FROM tasks 
    ORDER BY 
        CASE WHEN input_status IS NULL THEN '_' 
        ELSE output_status END ASC;

当然,您必须使 case 语句适应您的排序需求。

于 2013-08-21T13:13:31.513 回答
0

我不确定您是否定义了状态值的主关系。如果你这样做了,查询会更容易。

掌握 Stausstatus_idstatus_text( null, new, verify, 等)。子tasks节点从主节点引用输入和输出状态 id 值。

于 2013-08-21T13:49:54.393 回答
0

实际上,您需要一个 reqursive 查询来执行此操作。您可以将output_status其视为 ID 和 input_statusPARENT_ID。因此,您需要找到完整的 PARENT->CHILD 路径来分配订单号。

它可以在带有递归 CTE 的 MS SQL 中简单地完成,但据我所知,对于 MySQL 来说并不简单。

尝试使用这些 UDF 来制作排序字段,例如 [null->stat1->stat2->....]

另一种方法,如果有一个固定的最大状态计数,您可以使用 LEFT JOIN 连接以前的记录以查找排序路径。像这样的东西(这里有 3 个递归级别):

SELECT tasks.*
    FROM tasks
    LEFT JOIN tasks t1 on t1.output_status=tasks.input_status
    LEFT JOIN tasks t2 on t2.output_status=t1.input_status
    LEFT JOIN tasks t3 on t3.output_status=t2.input_status

ORDER BY tasks.title,t3.output_status,t2.output_status,t1.output_status

这里还有要考虑的链接:

于 2013-08-21T13:52:13.557 回答