2011-05-23 92 views
4

我有一個表下面的數據集SQL排序查詢問題

id name parent 
------------------ 
1 xyz NULL 
2 def NULL 
3 mno abc 
4 abc NULL 
5 pqr abc 
6 qfx def 

我想按照下面的順序來獲取數據:

1 abc NULL 
3 mno abc 
5 pqr abc 
2 def NULL 
6 qfx def 
4 xyz NULL 

我的意思是訂購具有由發生用戶名,但具有相同父級的記錄必須一起顯示,並且在父級記錄的下方。

我正在使用MySQL。

回答

2

嘗試這種新的答案:

SELECT * 
FROM table t 
ORDER BY 
    CONCAT(parent, name) 

它串聯兩個字符串所以應該爲了這樣的:

abc 
abcmno 
abcpqr 
def 
defqfx 
xyz 
+0

問題在於,在訂購時,假定'名稱'按字母順序大於'父'。如果名稱較少,排序不會按預期發生。 – jitendra 2011-05-23 08:20:26

+1

@curious:嘗試新的答案 – 2011-05-23 09:02:27

+0

我想你的意思是名字而不是id。 – jitendra 2011-05-23 09:11:34

0

使用下面的查詢:

Select * from table_name 
    Order by 
     name, parent; 
0

這不是一個問題呢?趕上它:

select * from mytable order by parent, name 
0

你最大的問題是你想要2個不同的方面。你需要用戶名順序,但是如果有一個匹配的父項你想分組它。

最明顯的是

select username, parent from mytable 
order by parent,username 
group by parent 

但仍然由家長先進行排序。

我確定它有可能得到你想要的東西,但是,我還沒有製作出一個簡單的完整解決方案的caffine。

0

Oracle中的其他人我發現有必要編寫Stored Proc來進行層次排序。一些RDBMS提供CTE(公用表表達式),可以獲得相同的結果。我不熟悉mySql,不知道它有什麼支持,但以下可能會有所幫助。

Wikipedia article

mySql specific

也是谷歌 「喬·塞科樹和層次結構」

1

像這樣的東西(不一定準確這樣):

SELECT * 
FROM atable 
ORDER BY COALESCE(CONCAT(parent, '.'), '') + name 

我真的嘗試用一個字符,不太可能出現在名稱更換'.'