我有一个MySQL表。我们称之为小部件。窗口小部件表有3个字段: id , type_id 和名称。在一个查询中,我希望获得与名为“doodad”的小部件共享 type_id 的所有小部件。我写过两个问题:
这很有效。每个查询都独立实现其目标。
但是当我将它们组合成一个嵌套查询时,它会永远运行,无限循环样式。它看起来像这样:
SELECT * FROM widgets WHERE type_id IN (
SELECT type_id FROM widgets WHERE name = 'doodad'
);
任何人都能解释一下吗?是因为我正在编写一个在同一个表上运行两次的嵌套查询吗?
小轮子,你为什么要旋转?
答案 0 :(得分:6)
There is an issue in MySQL和in
甚至将不相关的子查询视为相关并重新评估每一行。
在解释计划中,选择类型可能会显示为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)