0

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

content    rel     theme     theme_meta  

该表将来自表的rel表匹配到表的相应字段。有一个名为将其链接到表的字段。contentIDcontentrelthemetheme_metathemeIDtheme

所以

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

它为表的每个匹配行提供了大约 24 行content

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

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

4

1 回答 1

1

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

确实,听起来好像您的替代方法会在content每次调用其他查询(在其他表上)以获取连接的数据时循环一个查询(在表上)的结果:这种方法在很长一段时间内将被证明是非常昂贵的-term 并且不能很好地扩展。

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

$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 数据结构通常是不必要的昂贵,因为人们可能能够在读取结果集的同时构建和调度必要的输出。

于 2013-10-27T12:17:39.997 回答