我有一个表,其中包含要由进程执行的任务列表。每个任务仅适用于与输入状态匹配的项目,当任务完成时,它会将项目的状态更改为输出状态。
为了跟踪这些任务,我使用这样的表格。
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
排序也不起作用(显然)。
如何对首先null
的表格进行排序,然后是input_status
到output_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;
答案 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_id
和status_text
(null
,new
,verify
等。
子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
此处还有需要考虑的链接: