0

通常、私にとって明白な答えは「いくつかの結合」です。しかし、状況は次のとおりです。数千のエントリを持つテーブル、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);
4

1 に答える 1

1

DB をクエリするには 2 つの* 方法があります。

  1. 2 つの左結合ですべてのデータをまとめます。
  2. マスター データを取得し、必要に応じて詳細を読み込みます。

* 3 つのテーブルすべてを別々にロードしてから、それらを php でリンクしようとしないでください。

最初のアプローチでは、最初はロードに時間がかかる場合がありますが、データがロードされると DB 呼び出しはなくなります。一方、データを表として (繰り返しマスターを使用して) 表示するのは簡単かもしれませんが、多くの場合、それは望ましい UI ではありません。特別な UI コンポーネントを使用してマスター詳細を自動的に処理する場合を除き、テーブルをより適切な形式 (この場合はループ) に変換するのが難しい場合があります。

あなたの問題は、実際には、2 レベルのマスター詳細を表示する方法としての UI デザインの問題です。マスター詳細を表示する UI パターンは多数あります。

たとえば、ドロップダウンで最初のレベル (テーブル A) のみをロードし、DB にクエリを実行して、ドロップダウンの変更で 2 番目のレベルを表示することができます。または、折りたたみ時にデータベースにクエリを実行するツリーのような構造を持つこともできます。

いくつかのアイデアを得るために、このリンクを見てください。また、php のマスター/ディテール UI コンポーネントを検索してみることもできます。

于 2013-04-25T02:23:54.377 に答える