寻找解决此问题的方法,但尚无答案。
使用一列字母数字模型ID号以按特定顺序填充索引。根据他们产生的顺序进行两次不同的尝试:
ORDER BY Model_ID ASC
1278-8
211E
350-50
996
3800P
AP23
AP263
AP26M
JA042
ORDER BY CAST(Model_ID AS UNSIGNED), Model_ID
AP23
AP263
AP26M
JA042
211E
350-50
996
1278-8
3800P
但是,我需要对它进行排序,首先将所有整数起始数用尽:
211E
350-50
996
1278-8
3800P
AP23
AP263
AP26M
JA042
帮助?感谢
答案 0 :(得分:0)
对于样本数据,这将获得所需的顺序:
ORDER BY Model_ID+0=0, Model_ID+0, Model_ID ASC
让我们解开一下。
表达式Model_ID+0
通过向数字上下文添加零来计算数字上下文中的Model_ID。基本上,MySQL获取可以转换为数字的任何前导字符,并忽略其余部分。对于无法解释为数字的值,MySQL返回0.
第一个表达式检查数值是否为零,因此最后将对它们进行排序。 (对于布尔值TR,MySQL返回数值1,对于FALSE,返回0。)
第二个表达式获取按数字顺序排序的非零值。
注意:这些表达式"工作"样本数据;边缘情况是具有前导零作为数值的值,例如, ' 000ABC'将在所有其他"数字"之后进行排序。值。并且MySQL并不仅仅停留在整数部分,如果有点字符,则可以解释为小数点。
您可以通过将表达式包含在SELECT列表中来查看表达式的值(用于测试),例如
SELECT Model_ID+0=0, Model_ID+0, ...
答案 1 :(得分:0)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table (model_id VARCHAR(20) NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES
('1278-8'),
('211E'),
('350-50'),
('996'),
('3800P'),
('AP23'),
('AP263'),
('AP26M'),
('JA042');
SELECT model_id FROM my_table ORDER BY model_id + 0 = 0,model_id + 0;
+----------+
| model_id |
+----------+
| 211E |
| 350-50 |
| 996 |
| 1278-8 |
| 3800P |
| AP23 |
| AP263 |
| AP26M |
| JA042 |
+----------+