2014-06-24 46 views
1

我試圖用這種方式顯示產品類別;如何將「WITH」子句MS SQL轉換爲MySQL

Table Name: PSCategories 

PSId  | PSName   | ParentId(FK to PSCategories(PSId)) 
1   | test1   | NULL 
2   | test2   | 1 
3   | test3   | NULL 
4   | test4   | 3 
5   | test5   | 4 

我想用這種方式

PSId  | PSName     | ParentId 
1  | test1     | 0 
2  | test1 > test2   | 1 
3  | test3     | 0 
4  | test3 > test4   | 3 
5  | test3 > test4 > test5 | 4 

這MSSQL查詢可以做它來過濾該表數據,但如何將它轉換到mysql

WITH categories (PSId, PSName, ParentId) 
    AS (SELECT PSId, CAST(PSName AS VARCHAR(255)), 0 
     FROM PSCategories AS pm 
     WHERE pm.ParentId IS NULL 
     UNION ALL 
     SELECT ps.PSId, CAST(m.PSName + ' > ' + ps.PSName AS VARCHAR(255)), m.PSId 
     FROM PSCategories AS ps 
     JOIN categories AS m 
      ON m.PSId = ps.ParentId 
     WHERE ps.ParentId IS NOT NULL 
     ) 
SELECT * FROM categories 
ORDER BY PSId 
+0

將其複製並粘貼爲子查詢... –

+0

這是一個遞歸CTE,c&p不會在這裏工作 –

+0

@MartinK .:遞歸在哪裏? – gexicide

回答

0

你可以用」噸,MySQL不支持遞歸(也不CTE)。

我很抱歉成爲壞消息的持有者,但something_UID,something_parent_UID模式幾乎總是反模式。

閉包表比查詢更好(查詢更簡單,更快)。

因此,您應該將層次結構信息存儲在閉包表中。 在這裏看到: http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html 這裏: http://www.mysqlperformanceblog.com/2011/02/14/moving-subtrees-in-closure-table/

封閉表也有它的工作原理上的MySQL,其中CTE &遞歸不支持的優勢。

+0

我不同意鄰接模型是「*幾乎總是反模式*」。對於支持遞歸的現代DBMS來說,這通常非常有效,並且比封閉表更容易維護。對於只讀層次結構,封閉表可能是可以接受的,但當層次結構經常變化時不可以。 –

+0

@a_horse_with_no_name:是的,封閉表更難以理解。但爲什麼層次結構經常變化呢?爲什麼這應該是封閉表的問題? –

+0

@a_horse_with_no_name:另外,SQL-Server不支持在自引用上刪除級聯。 –