2013-08-21 44 views
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_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; 
+1

Oracle使用語法事先叫連接。在概念中,您尋找一個分層查詢,這是我的知識mySQL不支持的。但有一些方法可能會滿足您的需求,如:http://stackoverflow.com/questions/8104187/mysql-hierarchical-queries或http://stackoverflow.com/questions/10646833/using-mysql-query-to-遍歷行使make-a-recursive-tree,但其中一些是有風險的,因爲它們依賴未記錄的行爲在升級中保持不變。 – xQbert

+0

這個(細節)表定義中缺少兩個關鍵字段;日期或版本號+爲此表包含所有狀態的object_id。另外:大多數varchar字段看起來沒有完全依賴於PK的功能,應該放入「主」表 – wildplasser

+0

經過一些研究後,我發現這對於MySQL來說是不可能的。我應該將問題保留或打開嗎? – cgTag

回答

0

您可以構建(但不知道確切的語法)在其應用排序的情況下聲明:

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

當然,你將不得不case語句適應您的排序需求。

0

我不確定您是否定義了關於狀態值的主關係。如果你已經完成了,查詢會更容易。

主居留制舉行status_idstatus_textnullnewverify等)。 子tasks以從主引用輸入和輸出狀態id值。

0

其實你需要一個請求查詢來做到這一點。您可以將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->....]

另一種方法,如果有一個固定的最大狀態算你可以使用左手做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 

而且,這裏是需要考慮的環節:

相關問題