我几乎同意 Shyam 的观点,除了那个非常复杂的函数。
我推荐这个查询:
SELECT SUBSTRING_INDEX(reference,'/',-1) as `max`
FROM `Elements`
WHERE reference LIKE 'AES/JN/%'
ORDER BY reference DESC
LIMIT 1
这将输出以2003 作为max 列中的值的单行。
我喜欢这种方法的原因是CONVERT() 被省略/不必要。
我已将我的查询与服务器上的 Xenofexs' 进行了比较,我的查询仅快 .0001 秒——但这仅在 OP 发布的 5 行上运行。随着数据库量的增加,我相信我的查询的性能领先优势将会增加。
即使你不关心微优化,我认为这个查询更容易阅读/理解,因为它在函数内部没有函数。
事实上,我相信下一个查询可能会胜过我上面的查询:
SELECT SUBSTRING_INDEX(reference,'/',-1) as `max`
FROM `Elements`
WHERE LOCATE('AES/JN/',reference)
ORDER BY reference DESC
LIMIT 1
因为LOCATE() 将检查reference 列中的前导字符,并且目标子字符串不会出现在字符串的后面,所以LOCATE() 的性能已超过LIKE。
补充阅读:
MySQL LIKE vs LOCATE
作为记录,这是我使用的表格:
CREATE TABLE `Elements` (
`id` int(10) NOT NULL,
`reference` varchar(100) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `Elements` (`id`, `reference`) VALUES
(101, 'AES/JN/2001'),
(102, 'AMES/JN/2001'),
(103, 'AES/JN/2002'),
(104, 'AES/JN/2003'),
(105, 'AMES/JN/2002');
ALTER TABLE `Elements`
ADD PRIMARY KEY (`id`);
ALTER TABLE `Elements`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=106;