我有一張表,其中包含一個進程要執行的任務列表。每個任務只對符合輸入狀態的項目起作用,當任務完成時,它將項目的狀態更改爲輸出狀態。如何訂購通過狀態字段鏈接在一起的記錄
要跟蹤這些任務,我使用這樣的表格。
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;
Oracle使用語法事先叫連接。在概念中,您尋找一個分層查詢,這是我的知識mySQL不支持的。但有一些方法可能會滿足您的需求,如:http://stackoverflow.com/questions/8104187/mysql-hierarchical-queries或http://stackoverflow.com/questions/10646833/using-mysql-query-to-遍歷行使make-a-recursive-tree,但其中一些是有風險的,因爲它們依賴未記錄的行爲在升級中保持不變。 – xQbert
這個(細節)表定義中缺少兩個關鍵字段;日期或版本號+爲此表包含所有狀態的object_id。另外:大多數varchar字段看起來沒有完全依賴於PK的功能,應該放入「主」表 – wildplasser
經過一些研究後,我發現這對於MySQL來說是不可能的。我應該將問題保留或打開嗎? – cgTag