如何订购由状态字段链接在一起的记录

时间:2013-08-21 13:06:37

标签: mysql sql sorting

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

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

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_statusoutput_status排序也不起作用(显然)。

如何对首先null的表格进行排序,然后是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;

3 个答案:

答案 0 :(得分:0)

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

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

当然,您必须根据您的排序需求调整案例陈述。

答案 1 :(得分:0)

我不确定您是否已在状态值上定义了主关系。如果你已经完成了,查询会更容易。

Master Staus持有status_idstatus_textnullnewverify等。 子tasks要从master引用输入和输出状态id值。

答案 2 :(得分:0)

实际上你需要一个reqursive查询来做到这一点。您可以将output_status视为ID,将input_status视为PARENT_ID。因此,您需要找到完整的PARENT-> CHILD路径来分配订单号。

在MS SQL中可以通过递归CTE简单地完成,但对于MySQL,我知道它并不简单。

Try to use these UDF's to make sorting field for example [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

此处还有需要考虑的链接: