我有一个SQL字段的数据列表。我想按字段ASC排序,但是当我这样做时,它出现的顺序错误。我知道为什么会这样做,但想知道是否有解决这个问题的方法。我听说过natsort php功能,但没有调查过它。有一个简单的方法吗?
科学院
10岁以下的蓝色
10岁以下的绿色
11岁以下的红色
11岁以下的白人
13岁以下的蓝色
13岁以下的红色
13岁以下的白人
14岁以下的蓝色
15岁以下的蓝色
15岁以下的红色
15岁以下的白人
16岁以下的红色
18岁以下的蓝色
18岁以下的红色
7岁以下
8岁以下的红色
9岁以下
答案 0 :(得分:3)
有一种非常简单的方法可以对此列表进行排序。对于以Academy
开头的Under
的所有值,您可以根据以下ORDER BY子句执行排序算法:
ORDER BY
REPLACE(Academy,'Under ','') + 0,Academy
第一个排序列基于删除字符串'Under'然后添加0.这将强制对结果整数进行排序。
以下是通过首先删除“Under”来计算数值的示例:
mysql> select REPLACE('Under 15\'s Red','Under ','') + 0;
+--------------------------------------------+
| REPLACE('Under 15\'s Red','Under ','') + 0 |
+--------------------------------------------+
| 15 |
+--------------------------------------------+
1 row in set (0.00 sec)
第二个排序列将按Academy的字符串值排序。所有'Under 15's'
都组合在一起并按字母数字排序。
以下是您加载到表格中的问题的示例数据并已排序:
mysql> use test
Database changed
mysql> drop table if exists under99color;
Query OK, 0 rows affected (0.01 sec)
mysql> create table under99color
-> (academy varchar(30),
-> id int not null auto_increment,
-> primary key (id),
-> index academy (academy)) engine=MyISAM;
Query OK, 0 rows affected (0.04 sec)
mysql> show create table under99color\G
*************************** 1. row ***************************
Table: under99color
Create Table: CREATE TABLE `under99color` (
`academy` varchar(30) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `academy` (`academy`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> insert into under99color (academy) values
-> ('Under 10\'s Blue'),('Under 10\'s Green'),('Under 11\'s Red'),
-> ('Under 11\'s White'),('Under 13\'s Blue'),('Under 13\'s Red'),
-> ('Under 13\'s White'),('Under 14\'s Blue'),('Under 15\'s Blue'),
-> ('Under 15\'s Red'),('Under 15\'s White'),('Under 16\'s Red'),
-> ('Under 18\'s Blue'),('Under 18\'s Red'),('Under 7\'s'),
-> ('Under 8\'s Red'),('Under 9\`s Red');
Query OK, 17 rows affected (0.00 sec)
Records: 17 Duplicates: 0 Warnings: 0
mysql> select academy from under99color
-> ORDER BY REPLACE(Academy,'Under ','') + 0,Academy;
+------------------+
| academy |
+------------------+
| Under 7's |
| Under 8's Red |
| Under 9`s Red |
| Under 10's Blue |
| Under 10's Green |
| Under 11's Red |
| Under 11's White |
| Under 13's Blue |
| Under 13's Red |
| Under 13's White |
| Under 14's Blue |
| Under 15's Blue |
| Under 15's Red |
| Under 15's White |
| Under 16's Red |
| Under 18's Blue |
| Under 18's Red |
+------------------+
17 rows in set (0.00 sec)
mysql>
试一试!!!
答案 1 :(得分:1)
您可以在选择查询中添加一个字段,该字段使用CAST将其添加到数字中。首先,你必须提出一个子串方法,它将首先从字符串中选择数字(可能在空格和')上使用Field函数。一旦你将它作为整数隔离,那么在那一点进行排序应该是微不足道的。
可能的例子(伪代码 - 可能无法“开箱即用”):
SELECT TeamType, CAST(SUBSTRING(TeamType, FIELD(' ', TeamType), FIELD('\'', TeamType) - Field(' ', TeamType)), UNSIGNED) As TeamAge
FROM Teams
ORDER BY TeamAge, TeamType
答案 2 :(得分:0)
你的字段是字符串!因此,它正在对字符串值进行排序。
答案 3 :(得分:0)
按字母顺序排序;您需要解析输出字段并稍后根据该数字对它们进行排序。
答案 4 :(得分:0)
那么,您可以单独存储数字和颜色(选择空白颜色),然后按编号顺序,然后按颜色。 E.g:
SELECT CONCAT('Under ',ageIndex,'\'s ',colour) AS Team FROM Academy
ORDER BY ageIndex, colour
根据您的要求,这可能的优势在于您还可以分别对年龄和颜色进行查询。