2013-10-02 36 views
1

好的,有點難以給這個問題一個正確的標題,因爲我不知道你會稱這個函數爲什麼。MySQL如何給行定義一個數字

所以,我有一個名爲categories的表,它包含ID,ParentID,Name,OrderNo加上幾個。

我想要做的就是給每個類別的OrderNo,通過訂單號我的意思是,如果我的目錄樹如下:

Computers 
Computers > Laptops 
Computers > Desktops 
Computers > Components > Hard Drives 
Computers > Components > Monitors 
TVs 
TVs > LED 
TVs > LCD 

所以,我只是想給每個類別OrderNo啓動值從1 所以

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語句看起來是這樣的:

select ID,ParentID,Name,OrderNo 
from categories 
Order by ParentID,ID 

但不知道如何進一步推進它。 很抱歉的垃圾解釋 預先感謝 約翰

+1

也許你可以找到有用的東西在這裏:HTTP:// mikehillyer .com/articles/managing-hierarchical-data-in-mysql/ – Barmar

+0

所以你想要在分層數據中的每級索引? – Orbling

+0

@Orbling是的,我想是的。 – user2231688

回答

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); 
+0

謝謝你。試一試,它似乎已經完成了這個訣竅。是的,它將成爲導出腳本的一部分,因此不需要將其設置到數據庫或任何其他內容中。然而,它會變得複雜,因爲我選擇了大約15列,其中有幾個已經加入,所以我如何將這個工作納入方程,並且我是否需要包含@prevParentID:= c.'ParentID' AS' prevParentID'因爲它不是我想要包含在我的出口中的值 – user2231688

+1

是的,問題是我無法在'UPDATE'中顯式使用'JOIN(SELECT @var)'技巧;)。你可以[借用NULL安全比較](http://sqlfiddle.com/#!2/c41b5/8):'@prevParentID = c.ParentID OR(@prevParentID IS NULL AND c。ParentID IS NULL)'=>'@prevParentID <=> c.ParentID' as('NULL <=> NULL'爲'true') – Wrikken

+0

@ user2231688:這是查詢的重要部分,因爲SELECT任務需要去某個地方。你可以把它包裝在一個外部的SELECT中來提取你想要的值,也許這個賦值可能被隱藏在一些被忽略的函數值中。 – Orbling

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; 

這樣令人費解的是,你可能想要做它在應用程序代碼,而不是...

相關問題