【问题标题】:How to make simple MySQL Order by Alpha sets (a-z,a-z,a-z...)如何通过 Alpha 集(a-z、a-z、a-z...)制作简单的 MySQL 排序
【发布时间】:2016-02-26 23:54:01
【问题描述】:

我编写了一个儿童文字游戏,现在我正在尝试优化性能。游戏从具有特殊排序的数据库中挑选关键字,我想做得更好。

给定一个按字母数字排序的 MySQL 关键字字段:

keyword     sorting position

apple              1
apricot            2
avocado            3
banana             4
broccoli           5
carrot             6
cherry             7
coconut            8
grape              9

是否可以(在一个简单的 MySQL 查询中)在连续的字母数字组中对它们进行排序,以便每个组都有首字母与组中其他字母不同的关键字? 预期的结果是这样的:

keywords      group alpha sorting position

apple               1
banana              2
carrot              3
grape               4
apricot             1
broccoli            2
cherry              3
avocado             1
coconut             2

我通过编程迭代实现了这一点。我想知道这是否可以在一个简单的 MySQL 查询中完成。

【问题讨论】:

    标签: mysql sorting alphanumeric


    【解决方案1】:

    你可以使用变量:

    SELECT keyword
    FROM (
      SELECT keyword,
             @rn := @rn + 1 AS rn,
             @grp_rn := IF (@grp = LEFT(keyword, 1), @grp_rn + 1,
                           IF (@grp := LEFT(keyword, 1), 1, 1)) AS grp_rn
      FROM mytable
      CROSS JOIN (SELECT @rn := 0, @grp_rn := 0, @grp := '') AS var
      ORDER BY keyword) AS t
    ORDER BY grp_rn, rn
    

    @rn 简单地按keyword 升序枚举表记录。 @grp_rn 枚举属于同一LEFT(keyword, 1)(即keyword 的第一个字母)切片的记录。

    要更好地了解使用ORDER BY grp_rn, rn 进行排序的工作原理,您可以查看子查询返回的内容:

    keyword,  rn, grp_rn
    ====================
    apple,    1,  1
    apricot,  2,  2
    avocado,  3,  3
    banana,   4,  1
    broccoli, 5,  2
    carrot,   6,  1
    cherry,   7,  2
    coconut,  8,  3
    grape,    9,  1
    

    Demo here

    【讨论】:

    • 太棒了!它完美无缺。我仍在弄清楚它是如何工作的。这么几行,但它是关于 MySQL 变量的速成课程。我猜想使用IF 语句同时声明和测试变量会发生一些神奇的事情。您是否使用CROSS JOIN 来初始化它们?纯粹的魔法,高级的东西。谢谢!
    • @AlbertSoares 是的,CROSS JOIN 是初始化变量的典型方式。检查子查询返回的结果集,以了解变量的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多