MYSQL WHERE-IN子查询永远运行

时间:2010-08-29 23:27:38

标签: mysql nested

我有一个MySQL表。我们称之为小部件。窗口小部件表有3个字段: id type_id 名称。在一个查询中,我希望获得与名为“doodad”的小部件共享 type_id 的所有小部件。我写过两个问题:

  1. 给我一个名为'doodad'的小部件的type_id。
  2. 给我带有type_id的所有小部件。
  3. 这很有效。每个查询都独立实现其目标。

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

    SELECT * FROM widgets WHERE type_id IN  (
        SELECT type_id FROM widgets WHERE name = 'doodad'
    );
    

    任何人都能解释一下吗?是因为我正在编写一个在同一个表上运行两次的嵌套查询吗?

    小轮子,你为什么要旋转?

2 个答案:

答案 0 :(得分:6)

There is an issue in MySQLin甚至将不相关的子查询视为相关并重新评估每一行。

在解释计划中,选择类型可能会显示为dependant subquery,而不仅仅是subquery

我建议尝试使用派生表描述at the end of this article的方法来实现内部结果集。

或者您也可以查看constify procedure here,了解它是否可以帮助您解决此问题。

答案 1 :(得分:3)

使用JOIN可能会导致重复结果 - EXISTS的工作方式类似于IN,没有重复风险:

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