我有两个表,A 和 B,它们在 AB_xref 中一起外部参照。目前要从表 B 中获取数据,我将 A 中的所有行行转储到一个数组中,然后遍历每个索引,找到与该 A 行相关的多个 B 行。然后,我将 B 中的行缝合到 A 中的行数组中 - 创建一个嵌套数组。
有没有办法使用单个选择和条件来做到这一点?
看看这是否能让你接近你想去的地方:
询问:
SELECT
packages.name AS package_name,
activities.name AS activity_name
FROM
package_activity_xref pax
INNER JOIN packages ON packages.id = pax.package_id
INNER JOIN activities ON activities.id = pax.activity_id
PHP:
$results = get_assoc_array_from_sql($your_query);
$outputArray = array();
foreach($results as $result) {
if (array_key_exists($result['package_name'], $outputArray)) {
// we already have an array at this package, push the new item
array_push($outputArray[$result['package_name']], $result['activity_name']);
} else {
// the target array doesn't exist yet, make it
$outputArray[$result['package_name']] = array($result['activity_name']);
}
}
基本上,这段代码将遍历整个外部参照表一次(O(n)
其中外部参照n
中的记录数)。对于每条记录,它将查看包名称并查看密钥是否存在$outputArray
。如果不是,则将该键处的值设为具有当前活动名称的数组。如果确实存在,则将当前活动附加到该数组。
如果执行print_r($outputArray)
后执行,您应该会看到一个数组,x
其中x
包含不同包的数量。数组中的每个元素都是另一个数组,y
其中的元素y
是给定包的活动数。
注意:您需要get_assoc_array_from_sql
自己实现,但我假设您已经使用了一些实现,或者您正在使用mysqli_fetch_assoc()或类似的东西。