0

ページのコンテンツを構築するために使用される 4 つの関係テーブルを含むデータベースがあります。

content    rel     theme     theme_meta  

relテーブルcontentIDは、テーブルからテーブルのcontent対応するrelフィールドに一致しthemeます。には、それをテーブルにリンクするtheme_metaというフィールドがあります。themeIDtheme

そう

現時点でページを作成するときはJOIN、コンテンツ テーブルを del テーブルに結合し、それをテーブルに結合し、それをテーブルに結合しthemeますtheme_meta

テーブルの一致した行ごとに約24行が得られcontentます。

次に、いくつかの php ループを使用して、結果を行foreachごとに多次元配列に再構築します。content

それは効率的ですか?データベースに対して 2 つの呼び出し (1 つは 用content、もう 1 つはtheme. これにより、はるかに少ない行が生成され、操作が簡単になりますが、データベースへの 2 回目の呼び出しが必要になります。

4

1 に答える 1

1

前述のように、単一のクエリを使用するアプローチが通常は最善の方法です (データベース クエリは多くのオーバーヘッドを招くため)。

実際、別のアプローチではcontent、結合されたデータを取得するために (他のテーブルで) 他のクエリを呼び出すたびに、(テーブルで) 1 つのクエリの結果をループするように思えます。 -用語であり、うまくスケーリングしません。

したがって、データから多次元配列を組み立てるには、結合された結果をそれに応じてソートし、結果セットをループするときに最後に見た識別子を追跡するだけで済みます (結果の配列):

$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 に答える