当前位置: 首页 > 面试题库 >

循环中的MySQL查询与使用SQL连接

云英才
2023-03-14
问题内容

我正在公司内部就此问题的循环查询进行辩论:

$sql = "
  SELECT foreign_key
  FROM t1";

foreach(fetchAll($sql) as $row)
{
  $sub_sql = "
    SELECT *
    FROM t2
    WHERE t2.id = " . $row['foreign_key'];

  foreach(fetchAll($sub_sql) as $sub_row)
  {
    // ...
  }
}

而不是像这样使用sql连接:

$sql = "
  SELECT t2.*
  FROM t2
  JOIN t1
  ON t1.foreign_key = t2.id";

foreach(fetchAll($sql) as $row)
{
  // ...
}

关于此的附加信息,数据库巨大,数百万行。

我当然已经搜索了这个问题的答案,但是没有人能够以一种很好的方式来回答这个问题,并且获得了很多赞成票,这使我确信一种方法比另一种方法更好。

问题

有人可以向我解释为什么其中一种方法比另一种更好吗?


问题答案:

join如果仅因为它减少了将查询来回发送到数据库的开销,则通常认为该方法更好。

如果在表上有适当的索引,则这两种方法的基本性能将相似。也就是说,两种方法都将使用适当的索引来获取结果。

从数据库的角度来看,该join方法要优越得多。它将数据逻辑整合在一处,使代码更加透明。它还允许数据库进行优化,这些优化在应用程序代码中可能并不明显。



 类似资料:
  • 问题内容: 该表表示类别层次结构,层次结构顶部的元素的父ID为NULL。该表如下所示: 我正在尝试做的是建立一个SQL查询,这将使我返回: 任何给定[categoryId]的[categoryId],[categoryName]链。它应该循环并获取每一行,直到到达具有parentId == NULL的行为止。 如上面的示例示例234-> 91-> 35-> 20-> 1-> NULL(STOP)

  • 问题内容: 我正在使用 PostgreSQL ,而我的SQL查询有一个奇怪的问题。 根据使用的最晚日期参数 。我的请求没有执行相同的操作。 这是我的工作查询: 该查询大约需要2秒的时间(对我来说这是可以的,因为我有很多行)。当我为此查询运行EXPLAIN ANALYZE时,我有以下内容: 现在,当我在当前月份尝试相同的查询( 我们是4月6日,因此我试图获取所有April的application_i

  • 本文向大家介绍详解MySQL中的分组查询与连接查询语句,包括了详解MySQL中的分组查询与连接查询语句的使用技巧和注意事项,需要的朋友参考一下 分组查询 group by group by 属性名 [having 条件表达式][ with rollup] “属性名 ”指按照该字段值进行分组;“having 条件表达式 ”用来限制分组后的显示,满足条件的结果将被显示;with rollup 将会在所

  • 问题内容: 我正在使用Jesey在Java(JAX-RS)中实现Restful Web Service。我在Tomcat v7.0上运行它,我使用Hibernate将数据映射到数据库(MySQL)。我有一个查询来获取可交付成果的列表: 它给了我一百个可交付成果,但我想在Task表中拥有前三名。感谢您的帮助。如何修改查询? 请注意,这三个可交付成果不应重复。 与@FGreg答案存在冲突。当我使用这些

  • 问题内容: 我在ms access 2010中有2个表,如下所示 我想从贷款表中选择名称而不是数字(l_from&l_to) 问题答案: 两次这样的表: SQL Fiddle演示(它是SQL Server 2008,但我认为ms- access的语法应相同)

  • 问题内容: 使用此代码,我无法多次运行插入查询。它仅询问ID和名称一次(如果counter中的值大于1)。 让我借助一个示例进行说明:- 假设我将值2放入。这样,它应该询问我两次ID和名称,但只询问一次,然后它将我为ID和名称输入的值复制到表中两次。 我怎样才能解决这个问题?如果不能,请提出替代代码,以解决我的问题。 问题答案: 当PL / SQL块被编译时( 而不是 正在执行中),替换变量和分别