Mysql 如何排序由状态字段链接在一起的记录

Mysql 如何排序由状态字段链接在一起的记录,mysql,sql,sorting,Mysql,Sql,Sorting,我有一个表,其中包含一个流程要执行的任务列表。每个任务仅对与输入状态匹配的项起作用,当任务完成时,它会将项的状态更改为输出状态 为了跟踪这些任务,我使用这样的表 创建表“任务” `id`int10无符号非空自动增量, `标题'varchar80不为空, `作业类型'varchar45不为空, `输入_状态'varchar45默认为空, `输出_状态'varchar45默认为空, 主键'id` 任务的状态形成一个事件链。这里有一个例子 NULL -> NEW NEW -> CREATE

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

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

创建表“任务” `id`int10无符号非空自动增量, `标题'varchar80不为空, `作业类型'varchar45不为空, `输入_状态'varchar45默认为空, `输出_状态'varchar45默认为空, 主键'id` 任务的状态形成一个事件链。这里有一个例子

NULL -> NEW
NEW -> CREATE
CREATE -> INSPECT
INSPECT -> VERIFY
VERIFY -> PUBLISH
在现实生活中,任务列表很长。注意:我不知道不同状态的类型,这些是用户定义的值

当我使用输入状态的顺序查看表时,记录以错误的顺序显示任务。按输入\ U状态和输出\ U状态进行排序也显然不起作用

如何对表格进行排序,首先是null,然后是从输入\ U状态到输出\ U状态的链

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

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

选择*, 从作为父任务的任务中选择输入\ U状态 其中parent.output\u status=tasks.input\u status 分类 来自任务 按排序排序,输入_状态;
您可以构建一个case语句,在该语句上应用排序,但不确定确切的语法:

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

当然,您必须根据您的排序需要调整case语句。

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

主STAU保存状态标识和状态文本空、新、验证等。。
子任务从主任务中引用输入和输出状态id值。

实际上,您需要一个请求查询来完成它。您可以将OutPuthStand作为PaltSyid考虑为ID和IntPyStIm。因此需要找到完整的父->子路径来分配订单号。< /P> 使用MSSQL和递归CTE可以很简单地完成,但对于MySQL,我知道这并不简单

另一种方法是,如果存在固定的最大状态计数,则可以使用左连接连接以前的记录来查找排序路径。这里有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
这里还有一些需要考虑的链接:


Oracle使用名为connect by Previor的语法。从概念上讲,您正在寻找分层查询,据我所知,mySQL不支持这种查询。但是,有一些方法可以满足您的需要,例如:或者,但是其中一些方法是有风险的,因为它们依赖于未记录的行为来在升级中保持不变;此表包含其所有状态的日期或版本号+对象id。另外:大多数varchar字段看起来并不完全依赖于PK,并且可能应该放在主表中。经过一些研究,我发现MySQL不可能做到这一点。我应该保留问题还是删除它?