AB_xrefで一緒に外部参照されるAとBの2つのテーブルがあります。現在、テーブル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']);
}
}
基本的に、このコードは外部参照テーブル全体を 1 回ループします (O(n)
はn
外部参照のレコード数)。レコードごとに、パッケージ名を調べて、キーが$outputArray
まだ存在するかどうかを確認します。そうでない場合は、そのキーの値を現在のアクティビティ名の配列にします。存在する場合は、現在のアクティビティをその配列に追加します。
実行print_r($outputArray)
後に実行すると、個別のパッケージの数であるx
アイテムの配列が表示されます。配列内の各要素は、指定されたパッケージのアクティビティの数である要素x
を持つ別の配列になります。y
y
注:get_assoc_array_from_sql
自分で実装する必要がありますが、すでに使用している実装があるか、mysqli_fetch_assoc()などを使用していると思います。