我有一个数据库,其中包含用于构建页面内容的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
。这将产生更少的行并且更容易使用,但需要再次调用数据库。
答案 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数据结构通常是不必要的,因为人们可以在读取结果集时构建和分发必需的输出。