2015-11-24 4 views
1

Я написал игру слов для детей, и теперь я пытаюсь оптимизировать производительность. Игра выбирает ключевые слова из базы данных с особым типом. Я хочу сделать это лучше.Как сделать простой порядок MySQL по наборам Alpha (a-z, a-z, a-z ...)

Учитывая поле ключевых слов 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' является типичным способом инициализации переменных. Проверьте результат, возвращаемый подзапросом, чтобы понять, как работают переменные. –

 Смежные вопросы

  • Нет связанных вопросов^_^