MYSQL как выбрать наибольшее значение в столбце, если значение смешано со строкой - PullRequest
2 голосов
/ 11 июля 2019

Мне нужно выбрать максимальное значение из столбца, чтобы создать серийный номер. Проблема в том, что столбец представляет собой комбинацию строки и числового значения, поэтому я не получаю наибольшее числовое значение из моего запроса, поскольку столбец представляет собой смесь строкового и числового значения. Таблица состоит из auctions и shipments, поэтому столбец является общим для них обоих. если я генерирую серийный номер аукциона, я добавляю перед ним A и если я генерирую отгрузку, перед ним генерируется S. https://imgur.com/a/ToZDvWd

мой запрос

SELECT AuctionSerialNumber AS serialCount
    FROM auctions
    ORDER BY AuctionSerialNumber DESC LIMIT 1

функция, которая получает наибольший серийный номер и увеличивает его на 1

let serialCount = results2[0].serialCount;
serialCount = serialCount.replace(/[AS]/g, '');
let tempSerialNumber = parseInt(serialCount, 10);
let nextSerial = tempSerialNumber + 1;
nextSerial = 'S' + nextSerial;

как решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Это скорее показывает, как плохо было смешивать цифры и текст в одном столбце.

Было бы лучше поместить части int и char в 2 отдельных столбца.

Теперь вам нужно будет что-то сделать, чтобы нарезать это поле и разделить части, чтобы вы могли сделать правильный выбор. Примерно так например

SELECT right(AuctionSerialNumber,length(AuctionSerialNumber)-1) as serialCount
FROM auctions
ORDER BY cast(right(AuctionSerialNumber,length(AuctionSerialNumber)-1) as unsigned) DESC
LIMIT 1

right(AuctionSerialNumber,length(acode)-1) должен видеть S1234573 и возвращать просто 1234573, то есть только часть числа, так что вам больше не нужно регулярное выражение в другом коде, поэтому вы можете удалить эту строку

serialCount = serialCount.replace(/[AS]/g, '');
0 голосов
/ 11 июля 2019

ЕСЛИ вы используете оба значения в одном столбце. может быть, это будет иметь смысл. поэтому необходимо применять методы сортировки для полных данных.

select *,RIGHT(AuctionSerialNumber, length(AuctionSerialNumber)-1),left(AuctionSerialNumber, 1) from test_temp order by RIGHT(AuctionSerialNumber, length(AuctionSerialNumber)-1),left(AuctionSerialNumber, 1) asc
0 голосов
/ 11 июля 2019

Вы можете сделать с комбинацией функции sql что-то вроде -

SELECT CONVERT(SUBSTR(AuctionSerialNumber,2,LENGTH(id)-1),unsigned INTEGER),AuctionSerialNumber
 FROM auctions
ORDER BY CONVERT(SUBSTR(AuctionSerialNumber,2,LENGTH(id)-1),unsigned INTEGER) desc
limit 1

Надеюсь, это поможет вам в коде вашей функции.

скрипка: http://sqlfiddle.com/#!9/6f0553/6

...