【问题标题】:Order by in parent child hierarchy在父子层次结构中排序
【发布时间】:2017-03-20 14:33:58
【问题描述】:

我有下表,需要根据 strand 在父子层次结构中排序...我不知道如何根据父 ID 对其进行排序。

sid    parent_id    snum  strand         Sname
1       0           3      3.1           civics
2       0           3      3.2          geography
3       0           3      3.3          history
4       1           3      3.1.1        civic and insti
5       1           3      3.1.2        civic and poli
6       2           3      3.2.1        geo poli
7       4           3      3.1.1.1       CIVI
8       4           3      3.1.1.2       CIVVISSSDS

我希望按照以下方式根据父子层次结构中的链排序表..

Strand 
 3.1
 3.1.1
 3.1.1.1
 3.1.1.2
 3.1.2
 3.2
 3.2.1
 3.3

从几个小时开始就坚持下去......知道如何继续吗?

【问题讨论】:

  • 显示你的 SQL 语句
  • 我不知道这是否可以在 MySQL 中工作,但在 SQL Server 中只需在链上订购即可。你已经试过了吗?
  • 我使用插入语句将数据从 3 个不同的表中检索到新的第 4 个目标表中
  • @Kevin - 这可能适用于所有单位只用一个字符表示的琐碎样本,但通常对于这种事情,他们希望每个元素都被视为数字。 mysql 和 SQL Server 都不会在3.1.9.1 之后对3.1.10.1 进行排序,无需更多工作。 (相反,他们会将其放在 3.1.1.13.1.2.1 之间)
  • @Damien_The_Unbeliever - 事实上,你是对的。我只用问题中的样本数据进行了测试

标签: mysql sql join group-by sql-order-by


【解决方案1】:

使用这个

SELECT * FROM your_table
ORDER BY RPAD(trim(strand),50,'.0');

http://rextester.com/NIK55090

这样,您将3.1 更改为3.1.0.0.0.,因此排序是正确的。 将10 更改为比您的max(length(strand)) 更多

【讨论】:

  • 我的最大(长度)是 45 ..我尝试了 50 但它没有来
  • 但是当我尝试给出 5....除了第一个元素之外的所有内容都在排序...3.1 显示在列表的末尾...就像在 3.1.3.11 之后
  • 与 3.2 相同的情况..它显示在最后..而不是第一个
  • 尝试在答案中添加trim 作为更新。它适用于您提供的数据样本。
【解决方案2】:

您可以使用 rpad 进行排序(添加一些字符来构建相同长度的字符串)

  select * from your_table
  order by rpad(trim(strand), 64, 'Z')

【讨论】:

  • 它显示相同的结果..排序没有发生
  • 使用长度 > 最大字符数的值...并剪掉所有空格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多