Я столкнулся с чем-то, что я не совсем уверен, как справиться здесь. Я создаю базу данных для хранения информации о спортивных карточках, и у меня возникла проблема с сортировкой, когда я хочу увидеть определенные карточки.
Что касается предыстории, каждая карта (строка в базе данных) содержит информацию о годе, наборе карты, игроке на карте и номере карты (есть еще информация, но это все, что имеет значение здесь). Когда я вижу результаты, я хочу, чтобы все было отсортировано по году, затем по набору, затем по игроку, затем по номеру карты. Все, кроме номера карты, работает нормально, так как год — это просто целое число, а набор и игрок — это varchars, поэтому их легко сортировать. Тем не менее, номер карты - это то, с чем у меня возникают некоторые проблемы.
Столбец номера карты представляет собой varchar, поскольку номер карты может включать буквы, цифры и тире. Чаще всего номер карты представляет собой прямую цифру (например, 1, 2, 3, 4, 5), прямые буквы (Ex-A, Ex-B, Ex-C), число, за которым следует буква (1a, 1b). , 2, 3a, 3b, 3c) или букву, за которой следует цифра (A1, A2, A3, A4, A5). Вот как у меня в настоящее время настроена часть сортировки моей строки SQL:
order by year desc, cardset asc, subset asc, cast(cardNum as unsigned) asc;
Это прекрасно справляется с БОЛЬШИНСТВОМ вещей. Но у меня возникают проблемы, когда группа карт имеет одинаковые буквы в номере карты, а затем имеет номер. Я хочу, чтобы сортировка по существу игнорировала начальные буквы, а затем просто сортировала по номерам. Но иногда он делает это неправильно, особенно когда нужно отсортировать более 5 карточек.
В частности, он неправильно сортирует некоторые карты со следующими номерами карт в следующем порядке:
- BCP61
- BCP97
- BCP32
- BCP135
Когда это должно привести к:
- BCP32
- BCP61
- BCP97
- BCP135
В настоящее время он правильно сортирует прямые числа или числа, за которыми следуют буквы (например, 1, 2, 3, 4, 5 или 1, 2, 3a, 3b, 4, 5a, 5b). Я не знаю о каких-либо проблемах с неправильной сортировкой прямых букв, но в настоящее время у меня очень мало тестовых случаев, поэтому я не уверен, что это 100% или нет.
В дополнение к тому, что я не знаю, как изменить мой оператор сортировки SQL, не нарушая другие сортировки, я действительно не знаю, как он подходит к порядку, который он имеет для приведенного выше примера BCP. Есть мысли как исправить? Я думал о том, чтобы попытаться игнорировать буквы в номере карты, пока мы не перейдем к числам, но это вызовет серьезные проблемы с картами, в которых есть только буквы в номере карты. Так что я немного застрял.
Абсолютно худшее доходит до худшего, я, вероятно, мог бы разделить столбец с номером карты на 2 разных столбца: один для более описательной части, а другой для части, по которой я хочу сортировать. Это, вероятно, в конечном итоге будет работать нормально, но потребует много работы, чтобы вернуть все обратно!
Изменить. Вот еще информация, включая данные в моей БД (извините за форматирование, не знаю, как здесь делать таблицы):
| year | cardSet | subset | cardNum |
| 2016 | Bowman | | 52 |
| 2016 | Bowman | | 54 |
| 2016 | Bowman | | 147 |
| 2016 | Bowman | Chrome Prospects | BCP32 |
| 2016 | Bowman | Chrome Prospects | BCP61 |
| 2016 | Bowman | Chrome Prospects | BCP97 |
| 2016 | Bowman | Chrome Prospects | BCP135 |
| 2016 | Topps | | 1 |
| 2016 | Topps | | 2a |
| 2016 | Topps | | 2b |
| 2016 | Topps | | 3 |
Я ожидаю, что моя сортировка выдаст результаты в следующем порядке:
- 2016 Боумен 52
- 2016 Боумен 54
- 2016 Боумен 147
- 2016 Bowman Chrome Перспективы BCP32
- 2016 Bowman Chrome Перспективы BCP61
- 2016 Bowman Chrome Перспективы BCP97
- 2016 Bowman Chrome Prospects BCP125
- 2016 Топпс 1
- 2016 Топпс 2а
- 2016 Топпс 2b
- 2016 Топпс 3
Однако вот результаты, которые я получаю с помощью приведенного выше оператора сортировки:
- 2016 Боумен 52
- 2016 Боумен 54
- 2016 Боумен 147
- 2016 Bowman Chrome Перспективы BCP62
- 2016 Bowman Chrome Перспективы BCP97
- 2016 Bowman Chrome Перспективы BCP32
- 2016 Bowman Chrome Prospects BCP125
- 2016 Топпс 1
- 2016 Топпс 2а
- 2016 Топпс 2b
- 2016 Топпс 3
Он прекрасно обрабатывает номера карт только с цифрами или числами, за которыми следуют буквы, но имеет тенденцию к путанице, когда номер карты начинается с букв, а за ними следуют цифры.
Я попытался использовать трюк length() в комментариях, чтобы часть сортировки моего SQL была:
order by year desc, cardset asc, subset asc, length(cardNum), cardNum asc
Это действительно устраняет проблему, которую я описал выше, но портит часть «Topps» в моем примере — карты с буквами, следующими за цифрой, будут помещены последними, несмотря ни на что. Вот порядок, который я получаю с этим видом:
- 2016 Боумен 52
- 2016 Боумен 54
- 2016 Боумен 147
- 2016 Bowman Chrome Перспективы BCP32
- 2016 Bowman Chrome Перспективы BCP61
- 2016 Bowman Chrome Перспективы BCP97
- 2016 Bowman Chrome Prospects BCP125
- 2016 Топпс 1
- 2016 Топпс 3
- 2016 Топпс 2а
- 2016 Топпс 2b