查询-mysql无限极分类排序问题

问题描述

mysql无限极分类排序问题

表是这样设计的

2,4,5字段请无视
现在要查询出来这样格式的数据
一级分类
二级分类A
三级分类A
三级分类B
二级分类B
三级分类A
三级分类B
我使用的sql为 select * from vn_erp_healthprice order by sorts

sorts字段为varchar类型
查询的结果如下

排序结果满足业务要求,但为什么1-11排在1-2前面
还有 根据字符串排序这是个什么原理来着 好久没用过这种分类了 一时想不起来了
求大神赐教

表sql如下

 /*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50621
Source Host           : 127.0.0.1:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 50621
File Encoding         : 65001

Date: 2015-07-15 16:38:49
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `vn_erp_healthprice`
-- ----------------------------
DROP TABLE IF EXISTS `vn_erp_healthprice`;
CREATE TABLE `vn_erp_healthprice` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `lyid` varchar(10) NOT NULL DEFAULT '' COMMENT '维修项id',
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '维修项名称',
  `price` varchar(10) NOT NULL DEFAULT '' COMMENT '工时单价',
  `hours` varchar(10) NOT NULL DEFAULT '' COMMENT '工时',
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `sorts` varchar(20) NOT NULL DEFAULT '' COMMENT '排序',
  PRIMARY KEY (`id`),
  KEY `hid` (`lyid`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of vn_erp_healthprice
-- ----------------------------
INSERT INTO `vn_erp_healthprice` VALUES ('1', '', '保养(一级分类)', '', '', '0', '1');
INSERT INTO `vn_erp_healthprice` VALUES ('2', '', '更换(二级分类)', '', '', '1', '1-2');
INSERT INTO `vn_erp_healthprice` VALUES ('3', '1', '更换机油', '', '', '2', '1-2-3');
INSERT INTO `vn_erp_healthprice` VALUES ('4', '2', '更换机油滤清器', '', '', '2', '1-2-4');
INSERT INTO `vn_erp_healthprice` VALUES ('5', '3', '更换空气滤清器', '', '', '2', '1-2-5');
INSERT INTO `vn_erp_healthprice` VALUES ('6', '4', '更换燃油滤清器', '', '', '2', '1-2-6');
INSERT INTO `vn_erp_healthprice` VALUES ('7', '5', '更换全部火花塞', '', '', '2', '1-2-7');
INSERT INTO `vn_erp_healthprice` VALUES ('8', '6', '检查助力转向油', '', '', '11', '1-2-8');
INSERT INTO `vn_erp_healthprice` VALUES ('9', '7', '更换整车制动液', '', '', '2', '1-2-9');
INSERT INTO `vn_erp_healthprice` VALUES ('10', '8', '检查自动变速箱油', '', '', '11', '1-11-10');
INSERT INTO `vn_erp_healthprice` VALUES ('11', '', '检查(二级分类)', '', '', '1', '1-11');
INSERT INTO `vn_erp_healthprice` VALUES ('12', '9', '检查或者更换手动变速箱油', '', '', '11', '1-11-12');
INSERT INTO `vn_erp_healthprice` VALUES ('13', '10', '检查发动机正时皮带', '', '', '11', '1-11-13');
INSERT INTO `vn_erp_healthprice` VALUES ('14', '11', '更换空调滤清器', '', '', '2', '1-2-14');
INSERT INTO `vn_erp_healthprice` VALUES ('15', '', '定期(二级分类)', '', '', '1', '1-15');
INSERT INTO `vn_erp_healthprice` VALUES ('16', '12', '定期添加冷媒', '', '', '15', '1-15-16');
INSERT INTO `vn_erp_healthprice` VALUES ('17', '13', '检查空调管路', '', '', '11', '1-11-17');
INSERT INTO `vn_erp_healthprice` VALUES ('18', '14', '更换防冻冷却液', '', '', '2', '1-2-18');
INSERT INTO `vn_erp_healthprice` VALUES ('19', '15', '检查厚度、调整,必要时更换前刹车片', '', '', '11', '1-11-19');
INSERT INTO `vn_erp_healthprice` VALUES ('20', '16', '检查厚度、调整,必要时更换前刹车盘', '', '', '11', '1-11-20');
INSERT INTO `vn_erp_healthprice` VALUES ('21', '17', '检查厚度、调整,必要时更换后刹车片(蹄)', '', '', '11', '1-11-21');
INSERT INTO `vn_erp_healthprice` VALUES ('22', '18', '检查厚度、调整,必要时更换后刹车盘(鼓)', '', '', '11', '1-11-21');
INSERT INTO `vn_erp_healthprice` VALUES ('23', '', '调整(二级分类)', '', '', '1', '1-22');
INSERT INTO `vn_erp_healthprice` VALUES ('24', '19', '调整雨刮(雨刷)', '', '', '23', '1-22-23');
INSERT INTO `vn_erp_healthprice` VALUES ('25', '20', '检查电瓶', '', '', '11', '1-11-24');
INSERT INTO `vn_erp_healthprice` VALUES ('26', '21', '检查减震器', '', '', '11', '1-11-25');

解决方案

字符串排序是ASCII吗排的,1-11与1-2前面的1-是相同的,就到1与2这2个对比,1与2的ASCII值来排序的

解决方案二:

改成先按长度排序,再按字母排序
 select * from vn_erp_healthprice order by length(sorts),sorts

解决方案三:

字符串1-111-2,前两个字符串相等,第3个字符串'1'<'2',所以'1-11' < '1-2'
要按数值比较你得吧每一级都格式成等长,比如'001-011' > '001-002'

时间: 2025-01-02 00:54:32

查询-mysql无限极分类排序问题的相关文章

php+mysql查询实现无限下级分类树输出示例_php技巧

本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. 树输出: function get_array($user_id,$top=0){ global $mysql,$_G; $sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id

PHP实现无限极分类

利用两个for循环实现无限级分类 表: 字段名 字段类型 备注 默认值 id int 主键 auto-increment   name varchar 分类名称   pid int 父类id 0 顶级分类的 pid 默认就是0了.当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先将所有分类取出来,数据保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率. 先来构建一个原始数组,这个直接从数据库中查询出来就行

sqlserver实现树形结构递归查询(无限极分类)

SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存.可以使用CTE来执行递归操作.创建的语法是: with <name of you cte>(<column names>) as( <actual query> ) select * from

php无限极分类实现的两种解决方法_php实例

今天写了下无限极分类 下面就把代码贴上来了 写的不怎么样. method of classify one 复制代码 代码如下: <?php/* reader: 这是自己写的无限极分类实现方法 里面的编辑方法只是对分类名进行了编辑 没有进行移动操作 小弟能力有限忘大家多多包涵啊  第一种方法:CREATE TABLE `types` (  `type_id` int(11) NOT NULL AUTO_INCREMENT,  `type_name` varchar(20) NOT NULL,  `

JavaScript+CSS无限极分类效果完整实现方法_javascript技巧

本文实例讲述了JavaScript+CSS无限极分类效果完整实现方法.分享给大家供大家参考,具体如下: CSS样式: a {text-decoration:none;} a,a:visited {color:#000;background:inherit;} body {margin:0;padding:20px;font:12px tahoma,宋体,sans-serif;} dt {font-size:22px;font-weight:bold;margin:0 0 0 15px;} dd

BootStrap无限级分类(无限极分类封装版)_jquery

HTML部分 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>多级联动封装</title> <link href="./css/bootstrap.css" rel="stylesheet"> <script src="./js/jque

创建无限极分类树型结构的简单方法

先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) public function cate_display() { $cate = D('Cate'); $field = array('id','cate_name','p

sqlserver实现树形结构递归查询(无限极分类)的方法

SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存.可以使用CTE来执行递归操作.创建的语法是: with <name of you cte>(<column names>) as( <actual query> ) select * from

实现php无限极分类的方法

今天写了下无限极分类 下面就把代码贴上来了 写的不怎么样. method of classify one <?php /* reader: 这是自己写的无限极分类实现方法 里面的编辑方法只是对分类名进行了编辑 没有进行移动操作 小弟能力有限忘大家多多包涵啊 第一种方法: CREATE TABLE `types` ( `type_id` int(11) NOT NULL AUTO_INCREMENT, `type_name` varchar(20) NOT NULL, `type_p_id` va