mixed order by语句需要MySQL查询

mixed order by语句需要MySQL查询,mysql,Mysql,我简化了MySQL表的以下模式,它有一个索引字段,用于封装 整个注释线程中的注释项 +----------+------------+-----+---------+----------------+ | id | INTEGER | PRI | NULL | auto_increment | | comment | TEXT | | NULL | | | index | TEXT | |

我简化了MySQL表的以下模式,它有一个索引字段,用于封装 整个注释线程中的注释项

+----------+------------+-----+---------+----------------+
| id       | INTEGER    | PRI | NULL    | auto_increment |
| comment  | TEXT       |     | NULL    |                |
| index    | TEXT       |     | NULL    |                |
+----------+------------+-----+---------+----------------+

id: comment:                         index:
-------------------------------------------------------
1   Rootentry1                        1
2   Answer1 on Rootentry1             1.1
3   Rootentry2                        2
4   Answer1 on Answer1 on Rootentry1  1.1.1
5   Rootentry3                        3
6   Answer1 on Rootentry2             2.1
7   Answer2 on Rootentry1             1.2
现在,我希望以最新的Rootentry首先出现的方式对表进行排序。 结果应按以下顺序进行:

id: comment:                         index:
------------------------------------------------------
5   Rootentry3                       3
3   Rootentry2                       2
6   Answer1 on Rootentry2            2.1
1   Rootentry1                       1
2   Answer1 on Rootentry1            1.1
4   Answer1 on Answer1 on Rootentry1 1.1.1
7   Answer2 on Rootentry1            1.2
我需要一个排序算法,它以降序的方式对第一个索引进行排序,以升序的方式对下面的字符进行排序 对这样的条目进行排序的语句是什么

select 
*
from table1
order by 
cast(substring_index(`index`, '.', 1) as unsigned) desc,
substring(`index`, 2+length(substring_index(`index`, '.', 1))) asc
输出:

id  comment                             index
5   Rootentry3                          3
3   Rootentry2                          2
6   Answer1 on Rootentry2               2.1
1   Rootentry1                          1
2   Answer1 on Rootentry1               1.1
4   Answer1 on Answer1 on Rootentry1    1.1.1
7   Answer2 on Rootentry1               1.2
只是为了好玩

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,legal VARCHAR(12) NOT NULL UNIQUE);

INSERT INTO my_table (legal) VALUES ('1'),('1.1'),('2'),('1.1.1'),('3'),('2.1'),('1.2');

SELECT * FROM my_table;
+----+-------+
| id | legal |
+----+-------+
|  1 | 1     |
|  2 | 1.1   |
|  4 | 1.1.1 |
|  7 | 1.2   |
|  3 | 2     |
|  6 | 2.1   |
|  5 | 3     |
+----+-------+

SELECT *
     , FLOOR(INET_ATON(RPAD(legal,5,'.0'))/16000000) x -- or perhaps 16777216
  FROM my_table 
 ORDER 
    BY x DESC
     , legal;
+----+-------+------+
| id | legal | x    |
+----+-------+------+
|  5 | 3     |    3 |
|  3 | 2     |    2 |
|  6 | 2.1   |    2 |
|  1 | 1     |    1 |
|  2 | 1.1   |    1 |
|  4 | 1.1.1 |    1 |
|  7 | 1.2   |    1 |
+----+-------+------+

这会很棘手。您需要将索引按点拆分,并将其转换为整数,因为如果使用字母数字排序,10将出现在2之前。是否有最高级别的注释嵌套?你需要一次显示所有的评论吗,或者你能在超过一定深度的情况下懒散地加载答案/回复吗?@Bart Friederichs:是的,但这只是一个棘手的问题。因为主索引必须按降序排序,而所有次索引都需要按升序排序。您或其他任何人是否知道一种解决方案,可以在不为主索引创建额外列的情况下使用查询来解决此问题?@Arth:我有所有可用的注释,没有延迟加载。实际上,将不会有超过10个级别。但是目前我没有关于这个级别的技术限制。但我可以限制水平。这不是我问题的主要部分,但重要的是,我同意你的看法。谢谢你的意见!不幸的是,在安卓mysql中没有像substring_index和substring这样的函数。还有其他substr函数可用。我认为解决方案必须使用其中一个函数构建:通过您的输入,我几乎能够找到一个解决方案:通过castsubstrthreadIndex,1,IfNullNullifiInstrThreadIndex,'.-1,-1,lengththreadIndex作为unsigned desc,substrthreadIndex,instrthreadIndex,按注释顺序从表中选择*,'.'.+1 asc代码现在最多可处理9个子元素,然后出现问题,在对字符串进行排序时,desc 10出现在2之前。对于指数,例如2.10.1.1与2.2.1.1相比。我应该详细地搜索像这样的索引。并将它们转换为整数。。。这很棘手。。。