见SQL Fiddle。它生成一个列表,其中包含id为10
的元素的所有后代的id-s。
如果我在列INDEX
上添加ParentId
,则结果集会更改。现在只包括根元素的子元素,而不是所有后代元素。请参阅此SQL Fiddle。
这是MySQL中的错误吗?我不认为添加INDEX
应该更改查询的结果集。
如果我更改根元素的id,使其小于其他元素的id,即使使用INDEX
,它也会再次运行。请参阅此SQL Fiddle。
该查询生成一个包含元素x
的所有后代的id-s的列表,其工作方式如下:
x
的所有元素的id-s。以下是查询,其中<id>
是元素x
的ID:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`Id` SEPARATOR ',')
FROM `Table`
WHERE FIND_IN_SET(`ParentId`, @Ids)
) Level
FROM `Table`
JOIN (SELECT @Ids := <id>) temp1
WHERE FIND_IN_SET(`ParentId`, @Ids)
) temp2
为了完成,这里是提供不正确结果集的数据库模式:
CREATE TABLE `Table` (
`Id` int(8),
`ParentId` int(8),
INDEX(`ParentId`)
);
INSERT INTO `Table` (Id, ParentId)
VALUES
(10, NULL),
(2, 10),
(3, 2),
(4, 2),
(5, 10);