через чистый SQL? Не просто!
Мы сделали это в коде моего проекта, и, в основном, вы применяете регулярное выражение, которое соответствует серии цифр или не цифр (что-то вроде ([0-9]+)|([^0-9]+)
), превращает строку в кортеж таких серий, преобразует серии цифр в целые числа, затем сортирует кортежи с парным сравнением. Например:
"Lot 1" -> ("Lot ", 1)
"Lot 2" -> ("Lot ", 2)
"Lot 3" -> ("Lot ", 3)
"Lot 3a" -> ("Lot ", 3, "a")
"Lot 100" -> ("Lot ", 100)
Тогда при парном сравнении (а) сортируются целые числа перед строками, (б) сортируются целые числа в естественном порядке и (в) сортируются строки в естественном порядке.
Если бы вы могли применять регулярные выражения к столбцам для сортировки, вы могли бы использовать одно, чтобы «нормализовать» числа в строки цифр фиксированной длины, дополненные нулями. Как это:
"Lot 1" -> "Lot 0001"
"Lot 2" -> "Lot 0002"
"Lot 3" -> "Lot 0003"
"Lot 3a" -> "Lot 0003a"
"Lot 100" -> "Lot 0100"
Который должен правильно сортироваться. Однако, хотя вы можете сделать это в Oracle и некоторых других базах данных, в MySQL вам необходимо использовать пользовательскую функцию .
Однако вы можете сделать это вне базы данных. Добавьте столбец в таблицу лотов для хранения нормализованного имени лота, и всякий раз, когда вы вставляете строку из своего кода, генерируйте нормализованную форму и сохраняйте ее. Затем вы можете отсортировать, используя этот столбец.