1

好的,有点难以给这个问题一个合适的标题,因为我不太确定你会怎么称呼这个函数。

所以,我有一个名为 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

但不知道如何进一步推进。抱歉,垃圾解释提前谢谢约翰

4

2 回答 2

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;

如此复杂以至于您可能想在应用程序代码中执行此操作...

于 2013-10-02T19:40:10.723 回答
1

如果您想在 a 中动态生成它SELECT,可以使用以下查询。它可以用作 UPDATE 查询的输入以设置值。使其成为Wrikken答案的单行版本。

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);
于 2013-10-02T19:49:00.663 回答