1

メインのテーブルとメインのテーブルをサポートするテーブルの 2 つのテーブルがあり、wordpress の posts と posts_meta と非常によく似ています。

メインテーブル:

id タイトル、内容

id  | title     | content
1   | one       | content one
2   | two       | content two

メタ テーブル:

id item_id キー値

id  | item_id   | key       | value
1   | 1         | template  | single
2   | 1         | group     | top
1   | 2         | template  | page
2   | 2         | group     | bottom

そして私の目標は、最終的に、メイン テーブルのデータを含む配列をメタ テーブルとマージすることです。例:

$data = array(
    array(
        'id' => 1,
        'title' => 'one',
        'content' => 'content one',
        'template' => 'single',
        'group' => 'top'
    ),
    array(
        'id' => 2,
        'title' => 'two',
        'content' => 'content two',
        'template' => 'page',
        'group' => 'bottom'
    )
);

良い形でこれを達成するための最良の方法は何ですか?

私は PDO を使用してデータベースに接続していますが、現在どのように行っているかは、まず最初のテーブルのデータをクエリし、次に各結果についてメタ テーブルをクエリします。これには準備済みステートメントを使用します。高速にすることはできますが、それでもスクリプトのパフォーマンスに悪影響を及ぼします。

ありがとうございました

4

1 に答える 1

1

最初のクエリの結果ごとにメタ テーブルをクエリする代わりに

最初の結果から ID を抽出する必要があります。

$rows = q('SELECT * FROM posts');
$byIds = [];
foreach ($rows as &$row)
{
    $byIds[$row['id']] =& $row;
}

2 番目のクエリを実行します。

$rows2 = q('SELECT * FROM posts_meta WHERE item_id IN (' . implode(',', array_keys($byIds)) . ')');

次に、PHP で結果をループし、最初のクエリ結果とマージします。

foreach ($rows2 as $row2)
{
    $byIds[$row2['item_id']][$row2['key']] = $row2['value'];
}

マージされた結果が $rows 変数に含まれるようになりました。

var_dump($rows);

この方法では、2 つの db リクエストしかありません。

$byIds を参照の配列として使用しているため、2 番目のループで特定の ID を持つ行を検索する必要がないことに注意してください。このようにして、$rows 内の要素の順序が保持されます。

于 2013-01-08T18:34:57.983 に答える