按正确的顺序排序mysql数字

时间:2011-10-11 14:27:49

标签: mysql sql

我有一个SQL字段的数据列表。我想按字段ASC排序,但是当我这样做时,它出现的顺序错误。我知道为什么会这样做,但想知道是否有解决这个问题的方法。我听说过natsort php功能,但没有调查过它。有一个简单的方法吗?

科学院

10岁以下的蓝色

10岁以下的绿色

11岁以下的红色

11岁以下的白人

13岁以下的蓝色

13岁以下的红色

13岁以下的白人

14岁以下的蓝色

15岁以下的蓝色

15岁以下的红色

15岁以下的白人

16岁以下的红色

18岁以下的蓝色

18岁以下的红色

7岁以下

8岁以下的红色

9岁以下

5 个答案:

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

根据您的要求,这可能的优势在于您还可以分别对年龄和颜色进行查询。