如何在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')
;
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
|标题 | | :----- | | 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 日 |

db小提琴here

【讨论】:

这不只是我回答的更冗长的版本吗? 我没有看到你回答,当我看到它时,它被删除了。我认为这也更详细,因为我们不知道真实数据

以上是关于如何在mysql中对具有不同数据集的列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在sequelize中对嵌套模型中的列进行排序?

当数据集的列具有不同的行数时合并它们

如何使用 row.names 属性在 R 中对数据框的行进行排序?

JOOQ:在通用界面中对来自不同表的列进行逻辑分组

如何在 MySQL 中对具有不同平均值的三个变量进行分组?

如何同时对熊猫数据框中的列进行排序[重复]