mixed order by语句需要MySQL查询
我简化了MySQL表的以下模式,它有一个索引字段,用于封装 整个注释线程中的注释项mixed order by语句需要MySQL查询,mysql,Mysql,我简化了MySQL表的以下模式,它有一个索引字段,用于封装 整个注释线程中的注释项 +----------+------------+-----+---------+----------------+ | id | INTEGER | PRI | NULL | auto_increment | | comment | TEXT | | NULL | | | index | TEXT | |
+----------+------------+-----+---------+----------------+
| 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相比。我应该详细地搜索像这样的索引。并将它们转换为整数。。。这很棘手。。。