重新研究这个问题:php无限分类的子分类如何再排序

13881119614 发布于 2014/10/06 07:43
阅读 1K+
收藏 1

第一步。建立无限分类表。

CREATE TABLE IF NOT EXISTS `chi_category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `DishCategory_Path` varchar(255) DEFAULT NULL,
    DishCategory_Sort int(11), `DishCategory_Name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

第二步。使用以下查询语句

SELECT `id`,`DishCategory_Path`,`DishCategory_Name`,`DishCategory_Sort`,concat(`DishCategory_Path`,'-',id) as fullpath FROM `chi_category` order by fullpath 

第三步。看上面的语句结尾时order by fullpath。这个时候大致排序是正确的。
但是DishCategory_Sort这个字段的值没有排序。
因为order by要求当按照多个列进行排序时,只有第一列相同时才使用第二列。但是第一组fullpath是不可能相同的。所以现在不知道DishCategory_Sort这个字段的值如何排序。

我想实现的正确的情况是先按fullpath排序,然后 子分类例如 (川菜、卤菜)应该在上级分类(吃的)之下进行子分类的排序,如图所示 卤菜应该排在川菜前面才对。
那么现在怎么处理呢?各位大神

加载中
1
自由之信
自由之信

数据库表改动一下,用level表示每一个目录所在的级别,用parent_id表示上一级目录,会更容易一点,sort表示同一个level下面的顺序

category_id

parent_id

title

description

level

sort


自由之信
自由之信
回复 @13881119614 : 获得所有第一级菜单列表之后,然后再用 SELECT * FROM category WHERE level=1 AND parent_id=category_id(第一级菜单的)ORDER BY `sort` ASC,这是一个递归,可以在脚本里面实现,用ajax比较好。
自由之信
自由之信
回复 @13881119614 : 第一级菜单,SELECT * FROM category WHERE level=0 ORDER BY `sort` ASC
1
13881119614
请问大概按照你这样的结构。怎么进行排序。能做到我想要的效果。
0
Tuesday
Tuesday
这数据库设计, 在移动分类时多被动呀...
1
13881119614
回复 @Tuesday : 子排序也会生效么?我试试哈
Tuesday
Tuesday
回复 @13881119614 : pid直接用sort字段排序即可.
1
13881119614
回复 @Tuesday : 是的。这些都不是问题。关键是如何子类排序。pid的方法子类方便排序吗?
Tuesday
Tuesday
回复 @13881119614 : 那这个排序工程就大了. 或者可以在入库时就排好fullpath的顺序.
1
13881119614
回复 @Tuesday : 我们的设计模式不一样。你这个办法是无限分类的办法之一,我正在学习现在这种办法
下一页
0
欲望故事
欲望故事
不是先查出来再排吗
0
锋
order by fullpath,取结果集后,再根据DishCategory_Sort排序
0
自由PHP
自由PHP

我觉得设计思路应该是这样的

比如一个菜单在第二级、sort为8,那么在第二级中显示时就排在第8位

所以查询的时候,只要按照sort排序就可以,然后在根据父子层级关系组装成多维数组结构

无限级分类组装的做法就不用再去copy了,自行查找

个人觉得完全依靠数据库去完成所有不现实

0
疯奇奇
疯奇奇
这个问题最终怎么解决了呢???
返回顶部
顶部