PHP PDO mySQL 查询 - 最有效的方法


PHP PDO mySQL query - the most efficient method

我有一个数据库,其中包含 4 个用于构建页面内容的关系表:

content    rel     theme     theme_meta  

rel表将content表中的contentIDtheme表的相应rel字段进行匹配。 theme_meta有一个名为themeID的字段,该字段将其链接到theme表。

所以

在构建页面时,我将内容表JOIN到 del 表,将其连接到theme表和theme_meta表。

对于content表的每个匹配行,它为我提供了大约 24 行。

然后,我使用一些 php foreach 循环将结果重组为每行content多维数组。

效率高吗?对数据库进行 2 次调用会更快、更高效吗,一次用于content,一次用于theme。这将生成更少的行,并且更易于使用,但需要对数据库进行第二次调用。

如上所述,使用单个查询的方法通常是最佳方法(因为数据库查询会产生大量开销)。

事实上,听起来您的替代方法每次调用其他查询(在其他表上)以获取联接的数据时都会遍历一个查询(在content表上)的结果:从长远来看,这种方法将证明非常昂贵,并且不会很好地扩展。

因此,要从数据组装多维数组,您只需对连接的结果进行相应的排序,并在循环访问结果集时跟踪上次看到的标识符(以便检测何时需要遍历结果数组中的级别):

$qry = $dbh->query('
  SELECT   *
  FROM     content
      JOIN rel        USING (contentID)
      JOIN theme      USING (rel)
      JOIN theme_meta USING (themeID)
  ORDER BY contentID
');
$arr = array();
$row = $qry->fetch();
while ($row) {
  array_push($arr, array());
  $cid = $row['contentID'];
  do {
    array_push(end($arr), $row);
  } while ($row = $qry->fetch() and $row['contentID'] == $cid);
}
echo var_export($arr);

然而,我要提醒的是,从数据库查询的结果构建这样的PHP数据结构通常是不必要的成本,因为人们可以在读取结果集时构建和调度必要的输出。