使用mysql

时间:2017-06-12 07:51:55

标签: php mysql string substring

我有一个名为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/'

4 个答案:

答案 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 ;

如果它不适合你,请告诉我