如何在mysql中对具有不同数据集的列进行排序
Posted
技术标签:
【中文标题】如何在mysql中对具有不同数据集的列进行排序【英文标题】:how to sort a column with different data sets in mysql 【发布时间】:2020-07-01 21:20:53 【问题描述】:我有一列包含诸如
之类的值title
------
aaa 3
bbb 5
bbb 6
yyy 1
yyy 2
bbb 8
bbb 12
aaa 1
aaa 2
bbb 14
bbb 3
bbb 4
yyy 3
aaa 4
aaa 5
aaa 6
aaa 8
aaa 12
aaa 14
yyy 4
我希望我的结果是这样的
title
------
aaa 1
aaa 2
aaa 3
aaa 4
aaa 5
aaa 6
aaa 8
aaa 12
aaa 14
bbb 3
bbb 4
bbb 5
bbb 6
bbb 8
bbb 12
bbb 14
yyy 1
yyy 2
yyy 3
yyy 4
我之前遇到过关于堆栈溢出的类似问题,我发现的一个非常接近的解决方案是SELECT title FROM table ORDER BY LENGTH(title), title
,尽管它对我不起作用,因为它只能从 0-9 开始排序所有数据集,然后其余的数据集。
即。
aaa 1
aaa 2
aaa 3
aaa 4
aaa 5
aaa 6
aaa 8
bbb 3
bbb 4
bbb 5
bbb 6
bbb 8
yyy 1
yyy 2
yyy 3
yyy 4
aaa 12
aaa 14
bbb 12
bbb 14
建议将不胜感激。
【问题讨论】:
见meta.***.com/questions/333952/… 您想按日期订购。将列转换为日期,然后排序变得微不足道。 【参考方案1】:在空格处拆分字符串,并按每个部分排序。
ORDER BY SUBSTRING_INDEX(title, ' ', 1), 0+SUBSTRING_INDEX(title, ' ', -1)
0+
会将第二部分转换为数字,因此将按数字排序。
DEMO
ORDER BY LENGTH(title), title
仅适用于所有前缀都相同并且您只想在末尾按数字排序的情况。
【讨论】:
这是一个很好的举措,但它现在按数字排列每个集群,比如 aaa 1 bbb 1 yyy 1 aaa 2 bbb 2 yyy 2 不是真的,我想要的格式是aaa 1 aaa 2 aaa 3 aaa 4 aaa 5 aaa 6 aaa 8 aaa 12 aaa 14 bbb 3 bbb 4 bbb 5 bbb 6 bbb 8 bbb 12 bbb 14 yyy 1 yyy 2 yyy 3 yyy 4
我刚刚测试过,它产生了正确的结果。我添加了一个在线演示的链接【参考方案2】:
您需要这样的东西,将您的数据分成两部分,可以分类和排序
你必须检查你的实际数据,如果子字符串和 orde4r 仍然合适,那只能用你的数据进行测试
CREATE TABLE Table1 (title varchar(6)) ; INSERT INTO Table1 (title) VALUES ('jan 3'), ('mar 5'), ('mar 6'), ('oct 1'), ('oct 2'), ('mar 8'), ('mar 12'), ('jan 1'), ('jan 2'), ('mar 14'), ('mar 3'), ('mar 4'), ('oct 3'), ('jan 4'), ('jan 5'), ('jan 6'), ('jan 8'), ('jan 12'), ('jan 14'), ('oct 4') ;
|标题 | | :----- | | 1 月 1 日 | | 1 月 2 日 | | 1 月 3 日 | | 1 月 4 日 | | 1 月 5 日 | | 1 月 6 日 | | 1 月 8 日 | | 3 月 3 日 | | 3 月 4 日 | | 3 月 5 日 | | 3 月 6 日 | | 3 月 8 日 | | 10 月 1 日 | | 10 月 2 日 | | 10 月 3 日 | | 10 月 4 日 | | 1月12日| | 1月14日| | 3 月 12 日 | | 3 月 14 日 |SELECT CONCAT(title1,' ',Title2) title FROM ( SELECT title1 ,Title2 ,if (title2 < 11,1,if (title2 >= 11 AND title2 <21,2,3)) orderby FROM (SELECT SUBSTRING_INDEX(title,' ',1) title1,SUBSTRING_INDEX(title,' ',-1) + 0 title2 FROM Table1 ORDER By title1,title2) t1 ) t2 ORDER BY orderby, title1,title2
db小提琴here
【讨论】:
这不只是我回答的更冗长的版本吗? 我没有看到你回答,当我看到它时,它被删除了。我认为这也更详细,因为我们不知道真实数据以上是关于如何在mysql中对具有不同数据集的列进行排序的主要内容,如果未能解决你的问题,请参考以下文章