MYSQL WHERE-IN子查询永远运行

MYSQL WHERE-IN子查询永远运行,mysql,nested,Mysql,Nested,我有一张MySQL表。让我们称之为小部件。窗口小部件表有3个字段:id、type\u id和name。在一个查询中,我希望获得所有与名为“doodad”的小部件共享type_id的小部件。我写了两个查询: 给我名为“doodad”的小部件的类型\u id 给我所有具有该类型id的小部件 这很有效。每个查询都独立地实现其目标 但当我将它们组合到一个嵌套查询中时,它将以无限循环的方式永远运行。看起来是这样的: SELECT * FROM widgets WHERE type_id IN (

我有一张MySQL表。让我们称之为小部件。窗口小部件表有3个字段:idtype\u idname。在一个查询中,我希望获得所有与名为“doodad”的小部件共享type_id的小部件。我写了两个查询:

  • 给我名为“doodad”的小部件的类型\u id
  • 给我所有具有该类型id的小部件
  • 这很有效。每个查询都独立地实现其目标

    但当我将它们组合到一个嵌套查询中时,它将以无限循环的方式永远运行。看起来是这样的:

    SELECT * FROM widgets WHERE type_id IN  (
        SELECT type_id FROM widgets WHERE name = 'doodad'
    );
    
    有人能解释一下吗?是不是因为我正在编写一个嵌套查询,它在同一个表上运行了两次

    小轮子,为什么旋转你?

    中,即使是不相关的子查询也会被视为是相关的,并对每一行进行重新评估

    在解释计划中,选择的类型可能显示为
    从属子查询
    ,而不仅仅是所需的
    子查询

    我建议尝试所描述的使用派生表来具体化内部结果集的方法


    或者,您也可以查看
    constify
    ,看看它是否有助于您解决这个问题

    使用连接存在复制结果的风险-EXISTS的工作原理与中的
    类似,没有复制风险:

    SELECT x.* 
      FROM widgets x
     WHERE EXISTS (SELECT NULL
                     FROM WIDGETS y
                    WHERE y.name = 'doodah'
                      AND y.type_id = x.type_id)
    

    我之所以使用WHERE-IN子查询,是因为我以前使用的是JOIN,并且针对200万个小部件的数据库,它需要两分钟才能运行。作为两个独立的查询,运行时间不到一秒。@Whit-我发现了一些变通方法,您可以尝试看看是否可以让
    中的
    正常工作。我不敢相信,在constify发明6年后,它仍然不是mysql的一部分。它不只是手动创建临时表并加入临时表的别名吗?+1很好。我很想知道这是否对OP的表现更好。