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

标签 mysql sorting alphanumeric

我已经编写了一个 child 文字游戏,现在我正在尝试优化性能。游戏以一种特殊的方式从数据库中挑选关键词,我想做得更好。

给定一个按字母数字排序的 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 查询中完成。

最佳答案

您可以使用变量:

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 - 如何通过 Alpha 集(a-z,a-z,a-z ...)制作简单的 MySQL Order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33895379/

相关文章:

mysql - 按同一表的多个列的计数排序

java - 排序二维数组时类型不匹配

python - 识别包含数字和字符串的 pandas 数据框列

php - 在 PHP 中将整数转换为字母数字序列

php - SQL:检查值是否在 tbl1 或 tbl2 中可用

mysql - 将 MySql 数据库中的所有日期增加指定的天数

mysql - 在 mysql 5.7 中转换 rank() over (partition ....

java - 使用自定义比较器时使用 TreeSet 还是 ArrayList 更好

python - 按 x 然后按 y 对字典列表进行排序

c - isalnum 等效于使用#define