MySQL如何为一行定义一个数字

时间:2013-10-02 19:04:04

标签: php mysql

好吧,有点发现很难给这个问题一个合适的标题,因为我不确定你会称之为什么功能。

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

但不知道如何进一步推进它。 对不起垃圾解释 提前致谢 约翰

2 个答案:

答案 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);