用于查找根元素的MySQL查询

时间:2011-06-02 16:49:11

标签: mysql

注意:这实际上是论坛的数据库。

我陷入了一个有趣的问题。我创建了一个包含以下字段的数据库

ID (primary), 
Data, 
ParentID

ParentID 是同一个表中某些其他行的 ID 。但是,这种父子关系可以扩展到几个级别。最顶层的元素 0 parentID

数据库非常大(500 MB),并且每次查询行的根元素都会非常耗时。我想在这里做的是,添加另一列 rootID 。因此,如果某个特定数据的深度为3级,则该列中的ID应为root(0级)元素。

有人可以帮我解决这里的查询语法吗?

2 个答案:

答案 0 :(得分:2)

我假设根元素有ID = RootID。由于添加根ID是一次性的事情,我只是从

开始
UPDATE `table` SET RootID = ID

(当然,在创建新列之后)然后运行类似

的内容
UPDATE `table` t1 JOIN `table` t2 ON t1.RootID = t2.ID
   SET t1.RootID = t2.ParentID
 WHERE t2.ParentID <> 0

重复,直到看到零行更新。 (稍后当你添加一个新行时,你只需将RootID设置为父级的,如果它有一个,或者它自己 - 你不需要提升到根目录。)

答案 1 :(得分:0)

使用存储的功能。

CREATE FUNCTION FindRootID(in_ID INT)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE LastID INT DEFAULT in_ID;
DECLARE ParentID INT DEFAULT -1;

WHILE ParentID != 0 DO
    SET ParentID = (SELECT Parent FROM SomeTable WHERE ID = LastID);
    IF ParentID != 0 THEN
        SET LastID = ParentID;
    END IF;
END WHILE;

RETURN LastID;

END

然后:

UPDATE SomeTable SET RootID = FindRootID(ID);