我有一个名为Elements
的表id reference
101 AES/JN/2001
102 AMES/JN/2001
103 AES/JN/2002
104 AES/JN/2003
105 AMES/JN/2002
我想从字符串中获取最大数量。如果我的搜索关键字是AMES / JN,我应该得到2002.如果我的关键字是AES / JN,那么输出应该是2003
我尝试过以下代码:
select max(convert(substring_index(reference,'/', -1), unsigned)) as max
FROM Elements WHERE reference like 'AES/JN/'
答案 0 :(得分:2)
我几乎同意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;
答案 1 :(得分:1)
请查看" LIKE"工作' S。 你可以使用%作为小丑
只需更改您的查询并添加%字符即可。它的工作
SELECT
max(
CONVERT (
substring_index(reference, '/', - 1),
UNSIGNED
)
) AS max
FROM
reference
WHERE
reference LIKE 'AES/JN/%'
请注意:LIKE 'AES/JN/%'
答案 2 :(得分:0)
SELECT MAX(Z.COUNT),reference FROM
(
SELECT reference,CAST(SUBSTRING_INDEX(reference, '/', -1) AS DECIMAL) count
FROM Elements where reference like 'AES/JN/%'
)Z
尝试以上代码。
希望这有帮助。
答案 3 :(得分:0)
请找到以下解决方案。
查询:
select id,reference,digits(reference) as num_values from asasas where reference like 'AMES/JN%' order by num_values DESC limit 1
您需要在mysql中创建一个函数
DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`digits`$$
CREATE FUNCTION `digits`( str CHAR(32) ) RETURNS char(32) CHARSET latin1
BEGIN
DECLARE i, len SMALLINT DEFAULT 1;
DECLARE ret CHAR(32) DEFAULT '';
DECLARE c CHAR(1);
IF str IS NULL
THEN
RETURN "";
END IF;
SET len = CHAR_LENGTH( str );
REPEAT
BEGIN
SET c = MID( str, i, 1 );
IF c BETWEEN '0' AND '9' THEN
SET ret=CONCAT(ret,c);
END IF;
SET i = i + 1;
END;
UNTIL i > len END REPEAT;
RETURN ret;
END$$
DELIMITER ;
如果它不适合你,请告诉我