2015-11-24 24 views
1

我已經寫了一個兒童文字遊戲,現在我正試圖優化性能。遊戲從數據庫中挑選關鍵字並進行特殊排序,我希望更好地完成它。如何通過Alpha集(a-z,a-z,a-z ...)製作簡單的MySQL訂單

鑑於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查詢中完成。

回答

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

+0

好極了!它工作完美。 我仍然在搞清楚它是如何工作的。這麼幾行,但它是MySQL變量的速成班。我猜想使用'IF'語句同時聲明和測試變量會發生一些奇蹟。你使用'CROSS JOIN'來初始化它們嗎? 純粹的魔法,先進的東西。謝謝! –

+0

@AlbertSoares是的,'CROSS JOIN'是初始化變量的典型方法。檢查子查詢返回的結果集,以瞭解變量如何工作。 –

相關問題