【问题标题】:Multiple SELECTs in a complex mysql statement复杂的 mysql 语句中的多个 SELECT
【发布时间】:2015-01-30 23:04:39
【问题描述】:

我做了一个 mysql 查询,它使用存储在表 B 中的值“x”从表 A 获取结果集。现在每当我需要“x”时,我需要重新选择它多达 6 次。

我的查询的简化版本如下所示:

    SELECT * FROM A WHERE a = (SELECT x FROM B ...) AND b = (SELECT x FROM B ...)-5 AND c = (SELECT x FROM B ...)+7

在评估我的 sql 语句期间,有没有办法存储该值“x”? 如果不是,那么使用 2 个查询是否有意义(第一个查询获取 'x',第二个查询包含真实语句中的 'x')?

如果你想看我的一个陈述,这里有一个例子:

    "(SELECT * FROM map WHERE x BETWEEN :x-:sight and :x+:sight AND y BETWEEN :y-:sight+:map_max_y and :map_max_y) /*1.part*/

    UNION
    (SELECT * FROM map WHERE x BETWEEN :map_min_x and MOD((:x+:sight),:map_max_x) AND y BETWEEN :y-:sight+:map_max_y and :map_max_y ORDER BY y LIMIT 225)  /*2.part*/

    UNION
    (SELECT * FROM map WHERE x BETWEEN :x-:sight and :map_max_x AND y BETWEEN :map_min_y and :y+:sight ORDER BY y LIMIT 225) /*3.part*/

    UNION
    (SELECT * FROM map WHERE x BETWEEN :map_min_x and MOD((:x+:sight),:map_max_x) AND y BETWEEN :map_min_y and :y+:sight ORDER BY y LIMIT 225) /*4.part*/";

'x'、'y'、'sight' 都存储在数据库中,多次重新加载它们会伤害我的眼睛(这是尚未从数据库加载它们的旧版本)。而且我认为进行 2 次查询也是一个坏习惯。

先谢谢你们了,伙计们:)

【问题讨论】:

标签: mysql select store


【解决方案1】:

Mysql 优化器应该能够检测到这种重复的子选择并且只执行一次。只需确保它确实是相同的选择,它不使用任何外部变量,并使用 EXPLAIN 确认它已得到优化。

【讨论】:

  • 感谢您的快速回复。优化对我来说很重要,所以这让我感觉好多了。下一步是提高它的可读性 :) 但我想我现在知道了
  • 通过将 subselect 放入变量中,然后使用该变量构建外部选择(简单的字符串连接,此级别不涉及 SQL),可以轻松提高可读性。
  • 我的意思是(在 PHP 中):$subselect = "(SELECT ...)"; query("SELECT $subselect AS x FROM ... WHERE $subselect > 10 ORDER BY $subselect");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2013-09-09
  • 2021-01-19
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多