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

时间:2013-10-27 09:54:24

标签: php mysql pdo lag

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

content    rel     theme     theme_meta  

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

所以

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

实际上,听起来好像你的替代方法会在每次调用其他查询(在其他表上)来获取连接数据时循环遍历一个查询的结果(在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数据结构通常是不必要的,因为人们可以在读取结果集时构建和分发必需的输出。