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