1

我有两个表,一个主表,一个支持主表,与 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 连接到我的数据库,而我现在的做法是,我首先查询第一个表上的数据,然后对于每个结果,我查询元表,为此我使用准备好的语句,因为它是 suposed要快,但即便如此,它也会损害我的脚本的性能。

谢谢

4

1 回答 1

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 个数据库请求。

请注意,我使用 $byIds 作为引用数组,因此我不必在第二个循环中搜索具有特定 ID 的行。这样,$rows 中元素的顺序就被保留了。

于 2013-01-08T18:34:57.983 回答