通常、私にとって明白な答えは「いくつかの結合」です。しかし、状況は次のとおりです。数千のエントリを持つテーブル、tableA があります。数千のエントリを持つ別のテーブル tableB があります。各エントリには、tableA の行の ID と相関する番号があります。tableA の 1 行に対応する tableB には複数の行があります。何万ものエントリを持つ 3 番目のテーブル tableC があります。tableB の 1 つの行に対応する複数の行があります。
クエリは次のようになります: (詳細はあまり重要ではありません)
SELECT tableA.*, tableB.*, tableC.* LEFT JOIN tableB ON tableB.idA = tableA.id LEFT JOIN tableC ON tableC.idB = tableB.id WHERE tableA.id = some_number;
これはうまく機能しますが、結合のために大量の重複行が発生します。tableA の 1 つの結果、tableB のいくつかの結果、および tableC のいくつかの結果が必要です。
残念ながら、これを行うために、ネストされた多くの PHP 配列と for ループを使用しています。面倒なので、ネストされたすべての PHP ループを取り除くために 3 つの個別のクエリを使用するだけでよいのか、それとも JOINS を使い続ける必要があるのか疑問に思っています。
追加情報: "tableA": ジョブ ID (主キー) 名前 説明 日付 時間 顧客ステータス
"tableB": 作業 ID (主キー) ジョブ (ジョブ内の行の ID と関連付けられます) 概要の説明の日付
"tableC": times id (主キー) work (work 内の行の id と相関) start end
望ましい出力: どのような形式が最適なのかよくわかりません。1 つのジョブ行が必要で、それに伴う作業のリストと、各作業の時間のリストが必要です。
ネストされたループの例: $work は 2 つの値を持つ配列です。1 つ目は作品の配列、2 つ目は時間の配列です。
foreach ($work[0] as $workk=>$workv) {
echo("<div><h1>" . $workk . ": " . $workv["summary"] . "</h1><br/>Job: " . $workv["job"] . "</br>Date: " . $workv["date"] . "<br>Description:" . $workv["description"] . "<br/>Times:<br/>");
foreach ($work[1] as $workid=>$times) {
if ($workid == $workk) {
foreach ($times as $time) {
echo("Start: " . $time[0] . " | End: " . $time[1]);
}
break;
}
}
}
関数でこのコードを使用して「作業」配列を取得します (ここで、$query->result() は長い JOIN クエリからの行です)。
foreach ($query->result() as $row) {
if (!array_key_exists($row->id, $work)) {
$work[$row->id] = array("job"=>$row->job, "summary"=>$row->summary, "description"=>$row->description, "date"=>$row->date);
}
$times[$row->id][] = array($row->start, $row->end);
}
return array($work, $times);