我幾乎希亞姆同意除外可怕錯綜複雜的功能。
我建議這個查詢:
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;
做評論,如果你反對投票有一個人.. !! –
我沒有降低這一個,但是誰曾經這麼做過,因爲你在使用子查詢時,如果沒有一個可以實現所需的結果。 – mickmackusa
@mickmackusa是的。 –