如何通过Alpha集(a-z,a-z,a-z ...)制作简单的MySQL Order

时间:2015-11-24 13:48:44

标签: mysql sorting alphanumeric

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

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

[36.0, 1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 1.0]                          # n
[-100.0, 5.0, 110.0, 215.0, 320.0, 425.0, 530.0, 635.0, 740.0, 845.0, 950.0] # bins

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

keyword     sorting position

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

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

1 个答案:

答案 0 :(得分:0)

您可以使用变量:

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