[英]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。
您可以像这样添加自定义 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.