我写了一个儿童文字游戏,现在我正在尝试优化性能。游戏从数据库中选择一个特殊的关键字,我想做得更好。
给定一个按字母顺序排序的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查询中完成。
答案 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