【问题标题】:What's the best way to apply the same rule in multiple queries?在多个查询中应用相同规则的最佳方式是什么?
【发布时间】:2014-10-03 16:07:00
【问题描述】:

我的应用程序有一个仪表板屏幕,其中包含许多图表,显示用户活动、销售业绩等的指标和结果。

这些结果可以按日期、用户和许多其他选项进行过滤。假设我对每个图表都有一个查询,在这些多个查询中应用相同过滤规则的最佳方式是什么?复制相同“where”子句(相同过滤规则)的最佳方式是什么? ) 跨越多个查询?

例如,

SELECT * FROM users WHERE date = '2014-10-03';

SELECT * FROM products WHERE date = '2014-10-03';

两个查询具有相同的规则。 有人建议使用此规则设置一个变量并将其连接到其他查询。比如:

$where = "WHERE 日期 = '2014-10-03'";

$query = "SELECT * FROM users". $哪里;

...

$query = "选择 * FROM 产品"。 $哪里;

...

但我不认为这是一个好的做法。

【问题讨论】:

  • 将每个查询视为 distinct 操作 - 不要尝试跨不同查询“优化”此操作。但是,请酌情重用/缓存查询的结果(例如,无需运行 same 查询 N 次以显示在不同的容器中)。采用适当的关系设计、适当的索引、更新的统计信息,并相信 RDBMS 能够为每个 distinct 查询正确实施良好的计划 - 如果有疑问,请分析性能。
  • 你能说得更具体点吗?什么过滤规则?
  • 为每个查询添加相同的where 子句。
  • @user2864740 谢谢,但我的问题是在许多查询中复制相同的“where”子句(相同的过滤规则)的最佳方法是什么。
  • @FelipeFrancisco 我的评论回复是使用三个不同的查询。如何生成它们以减少代码重复(例如)是次要问题。我建议按照一组规则并使用适当的 SQL 占位符从头开始构建每个查询(开销可以忽略不计)。

标签: php mysql sql


【解决方案1】:

如果它与我过去遇到的问题相似,我猜你需要这些受到许多经常重复的 WHERE 条件的限制。用户、部门权限、时间等

在我的案例中起作用的是将它们变成字符串变量,并在生成图表和图形的查询中重用它们。当然,不要将用户数据插入到动态查询中。希望对您有所帮助。

【讨论】:

  • 您的解决方案很有用(我也这样做过),但这是合适的解决方案吗?
  • 观察sql注入这样的动态查询没什么问题。在大型 BI 产品中,这些可能被创建为过滤器对象,但在幕后它们所做的与您已经对串联所做的完全相同。
【解决方案2】:

如果表不共享相同的日期列名,则仅保持值动态不是一个更好的主意。

$date = '2014-10-03';

$query = "SELECT * FROM users WHERE `date_added` = $date";

$query = "SELECT * FROM products WHERE `date_purchased` = $date";

注意:使用适当的验证和安全检查在 sql 中使用用户输入数据。

【讨论】:

    【解决方案3】:

    我认为您应该考虑使用准备好的语句。类似于 Oracle 中的绑定变量。

    查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次

    这里有很好的解释:http://docs.php.net/pdo.prepared-statements

    还可以防止 SQL 注入攻击

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多