繁体   English   中英

MySQL 按字符串中的第一个单词排序

[英]MySQL order by first word in string

我的 MySQL 查询得到摩托车 model 按名称排序的名称SELECT * FROM models ORDER BY name即:

[
'1200 Superenduro'
'250 ETC Enduro, silver',
'350 ETC 2014',
'450 ETC 2014',
'50 EC-X',
'690 ETC 2014',
'RS 1200 Superenduro'
]

字符串中的第一个单词通常是一个带有引擎容量的数字,我想按这个容量排序。 预期的 output 应该是:

[
'50 EC-X',
'250 ETC Enduro, silver',
'350 ETC 2014',
'450 ETC 2014',
'690 ETC 2014',
'1200 Superenduro'
'RS 1200 Superenduro'
]

我尝试按第一个词进行ORDER BY ,但看起来它并没有真正起作用: SELECT * FROM models ORDER BY SUBSTRING_INDEX(name, " ", 1) 如何实现正确的排序? 我使用 MySQL 5.7。 我可能会在 PHP 中操纵 output。

在 MySQL 中,您可以提取第一个数字序列并转换为数字:

order by regexp_substr(name, '[0-9]+') + 0

是一个 db<>fiddle。

您可以像这样添加自定义 function:

DELIMITER //
CREATE FUNCTION firstNumber(s TEXT)
    RETURNS INTEGER
    COMMENT 'Returns the first integer found in a string'
    DETERMINISTIC
    BEGIN

    DECLARE token TEXT DEFAULT '';
    DECLARE len INTEGER DEFAULT 0;
    DECLARE ind INTEGER DEFAULT 0;
    DECLARE thisChar CHAR(1) DEFAULT ' ';

    SET len = CHAR_LENGTH(s);
    SET ind = 1;
    WHILE ind <= len DO
        SET thisChar = SUBSTRING(s, ind, 1);
        IF (ORD(thisChar) >= 48 AND ORD(thisChar) <= 57) THEN
            SET token = CONCAT(token, thisChar);
        ELSEIF token <> '' THEN
            SET ind = len + 1;
        END IF;
        SET ind = ind + 1;
    END WHILE;

    IF token = '' THEN
        RETURN 0;
    END IF;

    RETURN token;

    END //
DELIMITER ;

资源

在您必须以这种方式执行查询之后

SELECT * FROM models ORDER BY firstNumber(name)

(请注意,此排序未编入索引)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM