添加索引会更改结果集

时间:2017-11-22 09:09:28

标签: mysql database

SQL Fiddle。它生成一个列表,其中包含id为10的元素的所有后代的id-s。

如果我在列INDEX上添加ParentId,则结果集会更改。现在只包括根元素的子元素,而不是所有后代元素。请参阅此SQL Fiddle

这是MySQL中的错误吗?我不认为添加INDEX应该更改查询的结果集。

如果我更改根元素的id,使其小于其他元素的id,即使使用INDEX,它也会再次运行。请参阅此SQL Fiddle

该查询生成一个包含元素x的所有后代的id-s的列表,其工作方式如下:

  1. 连接父项为x的所有元素的id-s。
  2. 连接其父级位于上一步生成的列表中的所有元素的id-s。
  3. 重复步骤2,直到无法添加任何元素。
  4. 将所有列表连接成一个长的id-s列表。
  5. 以下是查询,其中<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);
    

0 个答案:

没有答案