我有两个表阿& B,和B具有许多:与A 1间的关系检索第二表中查询笨子阵列
当查询从A行我也想有返回对应的B的记录作为一个数组,并添加到从结果数组,所以我结束了这样的事情:刚
A-ROW
field
field
B-ITEMS
item1
item2
item3
有没有干净的方式与一个查询(可能是加入?)要做到这一点,还是应该我在A上对ID进行第二次查询并将其添加到结果数组中?
我有两个表阿& B,和B具有许多:与A 1间的关系检索第二表中查询笨子阵列
当查询从A行我也想有返回对应的B的记录作为一个数组,并添加到从结果数组,所以我结束了这样的事情:刚
A-ROW
field
field
B-ITEMS
item1
item2
item3
有没有干净的方式与一个查询(可能是加入?)要做到这一点,还是应该我在A上对ID进行第二次查询并将其添加到结果数组中?
在表A上连接表B会更高效。它不会为您提供所需形状的数据。但是你可以遍历这个结果并将数据构建成所需的形状。
下面是一些代码来说明这个想法:
// Join table B on table A through a foreign key
$sql = 'select a.id, a.x, b.y
from a
left join b on b.a_id=a.id
order by a.id';
// Execute query
$result = $this->db->query($sql)->result_array();
// Initialise desired result
$shaped_result = array();
// Loop through the SQL result creating the data in your desired shape
foreach ($result as $row)
{
// The primary key of A
$id = $row['id'];
// Add a new result row for A if we have not come across this key before
if (!array_key_exists($id, $shaped_result))
{
$shaped_result[$id] = array('id' => $id, 'x' => $row['x'], 'b_items' => array());
}
if ($row['y'] != null)
{
// Push B item onto sub array
$shaped_result[$id]['b_items'][] = $row['y'];
}
}
“...只需从A对ID进行第二次查询,并将其添加到结果数组......” - 这是正确的解决方案。 SQL不会理解嵌套的数组结构。
要建立在什么Smandoli说 -
运行辅助查询分别是更有效,因为即使在主表行数据( A)已经改变,副表(B)上未更改的数据将导致(MySQL)查询缓存命中,假设ID从不改变。
这不一定适用于联接查询方法。
由于如果辅助表(B)具有与主表中的单个行关联的多个行,则联接方法将为主表(A)提取重复数据,因此数据传递的数据也将减少。
希望有人希望做到这一点(相对)常见的数据检索类型可能会发现这有用。
令人印象深刻的解决方案,并很好勾勒。 – Smandoli 2010-08-16 16:01:58
我目前正在尝试在我的应用程序中执行此操作,但如果您不知道Datamapper(Overzealous Edition)是否会出现此问题,那么您的解决方案对我而言完全适用。在解决方案的布局和交付方面做得很好,只要每个人都有这样的真棒,清晰和经过深思熟虑的答案。 – 2010-08-17 02:50:27