SELECT candidate_num FROM candidate ORDER BY candidate_num
我们可以看到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;
答案 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的数据类型更改为整数后,您将按排序顺序获取该数字。