MYSQL WHERE-IN子查询永远运行
我有一张MySQL表。让我们称之为小部件。窗口小部件表有3个字段:id、type\u id和name。在一个查询中,我希望获得所有与名为“doodad”的小部件共享type_id的小部件。我写了两个查询: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 (
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的表现更好。