我需要更新表中的一些行,为简单起见,称为“三”。
我选择要使用此查询更新的列:
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/