合并元表与主表

时间:2013-01-08 18:28:43

标签: php sql pdo

我有两个表,一个主表,一个支持主表,非常类似于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连接到我的数据库,我现在正在做的是,我首先查询第一个表上的数据,然后对于每个结果,我查询元表,我使用预处理语句,因为它快速,但即便如此,它也会损害我的剧本的性能。

谢谢

1 个答案:

答案 0 :(得分:1)

而不是查询第一个查询的每个结果的元表

你应该从第一个结果中提取id:

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

并运行第二个查询:

$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作为引用数组,所以我不必在第二个循环中搜索具有特定id的行。这样就可以保留$ rows中元素的顺序。