我需要从一列中选择最大值以生成序列号。问题在于列是字符串和数字值的混合,因此我无法从查询中获得最高的数值,因为列是字符串和数字值的混合。
该表是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;
如何解决此问题?
答案 0 :(得分:2)
这确实表明在同一列中混合数字和文本是一个不好的主意。
最好将int和char部分放在2个单独的列中。
现在,您将需要做一些事情以将该字段切碎并分离各个部分,以便可以进行适当的排序。例如这样的东西
<img id="image" src="" alt="Image">
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
答案 1 :(得分:0)
您可以结合使用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
希望这对您的功能代码有所帮助。
答案 2 :(得分:0)
如果您在单个列中同时使用两个值。也许这是有道理的。 因此需要对完整数据应用排序技术。
select *,RIGHT(AuctionSerialNumber, length(AuctionSerialNumber)-1),left(AuctionSerialNumber, 1) from test_temp order by RIGHT(AuctionSerialNumber, length(AuctionSerialNumber)-1),left(AuctionSerialNumber, 1) asc