1

わかりました、この関数を何と呼ぶか​​本当にわからないので、この質問に適切なタイトルを付けるのは難しいと思います。

したがって、カテゴリと呼ばれるテーブルがあり、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

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