所以,我有一个名为categories的表,它包含ID,ParentID,Name,OrderNo以及更多。
我想要做的是给每个类别一个OrderNo,按订单号我的意思是如果我的类别树如下:
Computers
Computers > Laptops
Computers > Desktops
Computers > Components > Hard Drives
Computers > Components > Monitors
TVs
TVs > LED
TVs > LCD
所以我只想给每个类别一个从1开始的OrderNo值。 所以
Computers 1
Computers > Laptops 1
Computers > Desktops 2
Computers > Components 3
Computers > Components > Hard Drives 1
Computers > Components > Monitors 2
TVs 2
TVs > LED 1
TVs > LCD 2
希望这更有意义,它确实试图解释我想要做什么。 不幸的是,我不知道这样的功能会被调用,否则我会谷歌它。
我的初始选择语句如下所示:
select ID,ParentID,Name,OrderNo
from categories
Order by ParentID,ID
但不知道如何进一步推进它。 对不起垃圾解释 提前致谢 约翰
答案 0 :(得分:2)
SET @parent=0;
SET @sort=1;
UPDATE categories
SET OrderNo = (@sort := IF(
ParentID <=> @parentid,
@sort+1,
1 + IF(@parentid := ParentID,0,0)
))
ORDER BY parentid;
如此复杂,您可能希望在应用程序代码中执行此操作......
答案 1 :(得分:1)
如果您想在SELECT
中动态生成它,可以使用以下查询。它可以用作UPDATE查询的输入来设置值。使其成为Wrikken's answer的单行版本。
SQLFiddle:http://sqlfiddle.com/#!2/c41b5/8 (包装版本:http://sqlfiddle.com/#!2/c41b5/13)
SELECT c.`ID`,
c.`ParentID`,
c.`Name`,
@running := IF(@prevParentID <=> c.`ParentID`, @running + 1, 1) AS `OrderNoCalc`,
@prevParentID := c.`ParentID` AS `prevParentID`
FROM `Categories` c,
(SELECT @running := 0) r,
(SELECT @prevParentID := NULL) p
ORDER BY c.`ParentID`, c.`Name`
假设您的架构是这样的:
CREATE TABLE `Categories` (
`ID` int(10) NOT NULL auto_increment,
`ParentID` int(10) default NULL,
`Name` varchar(32) NOT NULL default '',
`OrderNo` int(10) default NULL,
PRIMARY KEY (`ID`),
KEY `ParentID` (`ParentID`),
KEY `OrderNo` (`ParentID`, `OrderNo`)
) ENGINE=InnoDB AUTO_INCREMENT=1;
INSERT INTO `Categories` VALUES (1, NULL, 'Computers', NULL);
INSERT INTO `Categories` VALUES (2, NULL, 'TVs', NULL);
INSERT INTO `Categories` VALUES (3, 1, 'Laptops', NULL);
INSERT INTO `Categories` VALUES (4, 1, 'Desktops', NULL);
INSERT INTO `Categories` VALUES (5, 1, 'Components', NULL);
INSERT INTO `Categories` VALUES (6, 5, 'Hard Drives', NULL);
INSERT INTO `Categories` VALUES (7, 5, 'Monitors', NULL);
INSERT INTO `Categories` VALUES (8, 2, 'LCD', NULL);
INSERT INTO `Categories` VALUES (9, 2, 'LED', NULL);