MySQL 查询优化 - 避免子查询

标签 mysql subquery

我需要更新表中的一些行,为简单起见,称为“三”。

我选择要使用此查询更新的列:

SELECT one.id
FROM one 
    JOIN `two` ON ( one.id = two.page )
    JOIN `three` ON ( one.id = three.item )
WHERE two.level = 1
    AND  two.item = (SELECT item FROM two WHERE page = 5 AND level = 1 ) 
    AND three.position > (SELECT position FROM three WHERE item = 5 ) 
ORDER BY three.position

现在我用我得到的 id 调用更新查询。

是否有机会消除子查询?

编辑(在梅兰妮评论之后):

表“一”:

|id|text|

表“二”:

|id|item|page|level|

表“三”:

|item|position|

所以当我运行查询时

SELECT item FROM two WHERE page = 5 AND level = 1

它将返回 f.ex 1 并且最终的 WHERE 子句将是:

two.item = 1 AND two.level = 1

这与以下内容不同:

two.level = 1 and two.page = 5

我有表一 - 一些文本和一些 one.id。我需要更新表三中位置高于我的项目(例如 id = 5)的所有项目。但这些项目在表二中也应具有相同的two.item,其中two.page = one.id且level = 1

很抱歉描述不准确。

最佳答案

您应该能够通过联接替换这些子查询:

SELECT one.id
FROM one 
    JOIN `two2` ON (two2.page = 5 AND two2.level = 1)
    JOIN `two` ON ( one.id = two.page AND two.item = two2.item )
    JOIN `three2` ON ( three.item = 5)
    JOIN `three` ON ( one.id = three.item AND three.position > three2.position)
WHERE two.level = 1
ORDER BY three.position

关于MySQL 查询优化 - 避免子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164963/

相关文章:

mysql - 如果 (SELECT...) = 0 插入。在MySql中

mySQL如何将NULL显示为0

javascript - 哪个更快..将变量传递给 javascript 函数或运行 MySql 查询来获取值?

python - mysqlclient-python 和安全问题

php - 如果我有 id 如何知道在哪个页码?

mysql - 如何从表格中选择常用标题?

android - 自动更新 ListView : Android

php - 来自 3 个表的关系 Laravel 4

mysql - 在更新中使用子查询转换此选择

mysql - 获取每组最高/最小 <whatever> 的记录