当我使用“order by”时,我在MySQL中选择的数据不按顺序排列

时间:2017-05-22 05:22:43

标签: mysql

   SELECT candidate_num FROM candidate ORDER BY candidate_num 

以上查询的结果是: enter image description here

我们可以看到candidate_num没有按顺序排列。以下是该表的结构。我无法理解为什么“2”在“19”之后。

CREATE TABLE `candidate` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `candidate_num` varchar(10) NOT NULL,
  `name` varchar(50) NOT NULL,
  `age` int(3) NOT NULL,
  `major` varchar(50) NOT NULL,
  `company` varchar(50) NOT NULL,
  `department` varchar(50) NOT NULL,
  `native_place` varchar(50) NOT NULL,
  `ethnicity` varchar(50) NOT NULL,
  `highest_education` varchar(50) NOT NULL,
  `group` varchar(50) DEFAULT NULL,
  `is_elected` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `candidate_num` (`candidate_num`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;

4 个答案:

答案 0 :(得分:3)

这里" candidate_num"是一个字符串(varchar字段),因此它按词汇顺序排序。如果是这样,您可以通过以下方式订购:

SELECT `candidate_num` FROM `candidate` ORDER BY convert(`candidate_num`, decimal) ASC;

注意:对于varchar,它按词汇顺序对数据进行排序,即首先将值1放在第一位,然后将值2放在第二位等等。

答案 1 :(得分:1)

candidate_num的数据类型是varchar类型。您不能按此列的值排序,如数字类型。

<强>解决方案:

 `candidate_num` int(6) NOT NULL,

注意:

SELECT `candidate_num` FROM `candidate` ORDER BY convert(`candidate_num`, decimal) ASC;

如果保留此列的varchar数据类型并在使用order by时转换值,则性能将完全降低

答案 2 :(得分:1)

呃,候选人编号 IS 按顺序,它是数字顺序而不是数字数量顺序。 [正如Mayank所描述的那样;它按词汇顺序排序]

默认情况下,MySQL数字列是自然排序的(您想要的排序),因此只需使用CAST()ORDER BY列从VARCHAR更改为数字列。以下是设置为 int 列:

SELECT candidate_num FROM candidate ORDER BY CAST(candidate_num AS UNSIGNED)

另见:
- Natural Sort in MySQL
- Cast from VARCHAR to INT - MySQL

正如其他人所说,如果您的列内容始终是数字,您真的应该将列更改为 INT ,或 DECIMAL 等...数值,而不是尝试在evey SQL调用上使用CAST值。

答案 3 :(得分:0)

如果候选编号始终保持为编号,那么您必须将候选编号的数据类型转换为整数而不是保留为Varchar。

将candidate_number的数据类型更改为整数后,您将按排序顺序获取该数字。