我希望在输出中有一个像这样的层次顺序:
- 我的资料:*
Name | Cost | Level
----------------+--------+------
Car1 | 2000 | 1
Component1.1 | 3000 | 2
Component1.2 | 2300 | 3
Computer2 | 5000 | 1
Component2.1 | 2000 | 2
Component2.2 | Null | 3
字符串
- 输出:显示所有这些数据,其中有钱,并按级别排序,比如首先是1,然后是2,然后是3,然后再从1开始。
Name | Level
------------------+------
Car1 | 1
Component1.1 | 2
Component1.2 | 3
Computer | 1
Component2.1 | 2
型
ORDER BY
做的是:*
Name | Level
----------------+------
Car1 | 1
Computer1 | 1
Component1.1 | 2
Component2.1 | 2
Component1.2 | 3
Component2.2 | 3
型
- 我尝试了
CONNECT BY PRIOR
功能,但效果不好 *
SELECT Name, Level
FROM Product
CONNECT BY PRIOR Level;
型
4条答案
按热度按时间j7dteeu81#
你可以用下面一个
字符串
按名称排序将按层次顺序打印结果,但是如果它有一个名为parent id的列,那么它会更容易显示。
idv4meu82#
我建议你:
字符串
ukqbszuj3#
在MySQL中,你通常会使用“order by”。所以如果你想在表行“level”上排序,你的语法会是这样的:
字符串
您可以使用ASC(升序)或DESC(降序)。
ss2ws0br4#
在我看来,从你的数据集中,你想根据组件末尾的版本号对组件进行数字排序。如果这是你真正想要的,那么你可以忽略名称中的非数字字符,并按照字符串末尾的纯数字进行排序(使用必需的
where
子句)。字符串
如果是这样的话,那么将
level
也添加到ORDER BY
应该不会有任何区别,除非你的版本和级别的数字顺序是同步的。如果你有像
component2_name1.2
这样的组件可能会打破这个逻辑,你可能需要REGEXP
来识别所需的模式,那么可能会出现问题。但是,从你的数据来看,情况并非如此,我假设是这种情况,你可能想澄清一下,如果这不是你在数据集中总是有的话。下面是对样本数据获得的结果的演示。
Demo
这将工作的数字字符始终是一个有效的小数点,只有一个小数点。如果你有复杂的版本控制系统,如
1.1.8
,2.1.1
等,它需要在REPLACE ( name, TRANSLATE(name,' .0123456789',' '),'')
之上复杂的排序。你会在像Here这样的帖子中找到这样的例子