Найти последнее буквенно-цифровое значение в MySQL - PullRequest
1 голос
/ 22 августа 2010

У меня есть поле, которое содержит имена пользователей в базе данных mysql, например:

johndoe2
johndoe10
johndoe3

Если я закажу по этому полю DESC Я получу:

johndoe3
johndoe2
johndoe10

Мне нужно получить:

johndoe10
johndoe3
johndoe2 

Любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 22 августа 2010

Это гигантский хак, но, думаю, сработает. Если имя вашего столбца s:

order by 
  (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(s, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', ''),
  length(s) desc,
  s desc

Сначала выполните сортировку по алфавитной части текста, чтобы собрать все одинаковые имена, затем по длине, чтобы отсортировать их примерно численно, затем по s. Последний order by s теперь работает правильно, потому что он используется только для устранения неоднозначности между одинаковыми именами с одинаковым количеством цифр.

0 голосов
/ 22 августа 2010

Если производительность не имеет значения, подумайте о написании функции , подобной этой, для удаления нечисловых символов , а затем просто включите вызов в ваш ORDER BY.

 SELECT * 
 FROM MyTable
 ORDER BY 
      CAST(strip_alpha(UserName) as int) DESC

Для более быстрого и удобного решения рассмотрите возможность извлечения числа из имени пользователя в новый столбец.Тогда вы можете легко ЗАКАЗАТЬ ПО:

 SELECT *
 FROM MyTable
 WHERE  UserName LIKE 'johndoe%'
 ORDER BY TrailingDigit DESC
...