2011-05-23 65 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 

我真的尝试用一个字符,不太可能出现在名称更换'.'